11

名前、住所、電話番号を持つオブジェクトの配列があります。番号など

名前フィールド、住所フィールドなどで、用語の出現を配列で検索できるようにしたいと考えています。

私はこのようなことを念頭に置いています:

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array


    [self.searchResults removeAllObjects];
    // Filter the array using NSPredicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchText];
    searchResults = [NSMutableArray arrayWithArray:[contactArray filteredArrayUsingPredicate:predicate]];
}

これにより、「コレクションで in/contains 演算子を使用できません」という例外が発生します。

アップデート。最大 3 つのフィールドを検索できるようになりました。4 番目を (任意の順序で) 追加すると、「フォーマット文字列を解析できません ...」という例外が発生します。

Predicate コードは次のようになりました。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.narrative contains[c] %@ OR SELF.category contains[c] %@ OR SELF.date contains[c] OR SELF.name contains[c] %@", searchText, searchText, searchText, searchText];

     searchResults = [NSMutableArray arrayWithArray:[allDreams filteredArrayUsingPredicate:predicate]];

述語検索フィールドの制限は 3 つですか? どうすればこれを回避できますか? 再度、感謝します。

4

2 に答える 2

17

それらすべてをチェックする述語文字列を使用するだけです。

@"name contains[cd] %@ OR address contains[cd] %@"

いくつでも追加できます。

唯一の欠点は、テストするフィールドごとに同じ検索文字列を追加する必要があることです。

オブジェクトが辞書である場合、サブクエリを使用して、コンパイル時に名前を知らなくてもすべての値を真に検索する方法があります。

それはこのように動作します:

@"subquery(self.@allValues, $av, $av contains %@).@count > 0"

辞書オブジェクトに@allValues特別なキー (または必要に応じてメソッド呼び出し) を使用し、それを使用して検索文字列を含む値をフィルター処理します。いずれかが見つかった場合 (つまり、カウントが正の場合)、そのオブジェクトが結果に含まれます。

これにより、すべての値が無差別に調べられることに注意してください。ディクショナリに含まれている場合は含めたくない値も含まれます。

于 2013-09-16T08:05:17.700 に答える
4

あなたの配列項目は純粋な文字列ではないと思いますよね?

配列アイテムにname属性が含まれているとします(辞書であっても)、次の方法で検索できます。

NSPredicate * predicate =
  [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR name LIKE[cd] %@", searchText, searchText];

ここで、nameすることができますSELF.name


HEREは公式ドキュメントです。

于 2013-09-16T08:04:17.333 に答える