1

現在、これを使用して辞書の配列を検索しています(plistファイルから):

for(NSDictionary *wine in mainArray)
    {
        NSString *wineName = [wine objectForKey:@"name"];
        NSRange range = [wineName rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if(range.location != NSNotFound)
            [searchArray addObject:wine];
    }

この質問では、例としてこのplistを使用します。

<array>
<dict>
  <key>name</key>
  <string>Banana One (Yellow)</string>
  <key>value</key>
  <string>1</string>
</dict>
<dict>
  <key>name</key>
  <string>Apple Two (White)</string>
  <key>value</key>
  <string>2</string>
</dict>
<dict>
  <key>name</key>
  <string>Pineapple Three (Orange)</string>
  <key>value</key>
  <string>3</string>
</dict>
<dict>
</array>

(値は気にしないでください)

わかりました、NSCaseInsensitiveSearch で UISearchBar を使用しているときは、(ObjectForKey=@"name")Case を考えずに配列を検索するだけです。良い!

たとえば、次を検索し@"banana"て、:Banana One (Yellow) を見つけることができます。

そして私は検索することができます:@"two"そして :Apple Two (White) を見つけることができます

「one」を検索@"bananaして、「Banana One (Yellow)」を見つけます。

@"Orange"また、次を検索して、:Pineapple Three (Orange) を見つけることもできます。

ただし、検索が正しい順序で行われた場合のみ

検索できません:@"One Banana"または@"Yellow One"@"Yellow Banana" キーワードを使用して、このように検索できるようにしたいですか?

多分このようなもの?:

for(NSDictionary *wine in mainArray)
{
NSArray *myArray = [searchText componentsSeparatedByString:@" "];
    NSString *wineName = [wine objectForKey:@"name"];
    NSRange range = [wineName rangeOfString:myArray options:NSCaseInsensitiveSearch];
    if(range.location != NSNotFound)
        [searchArray addObject:wine];
}

これが本当にうまくいかないことはわかっていますが、私の言いたいことがわかると思いますか? では、たとえば次のように検索できるようにする方法:@"one banana"そして :Banana One (Yellow) を見つける方法

4

3 に答える 3

1

を使用して次の解決策を考え出しましたNSPredicate

    NSArray *objects = @[@"Banana One",@"Apple Two"];
    NSString *searchString = @"one banana";
    NSArray *searchComoponents = [searchString componentsSeparatedByString:@" "];

    NSMutableString *format = [NSMutableString stringWithFormat:@"SELF CONTAINS[c] \"%@\"",[NSString stringWithFormat:@"%@",searchComoponents[0]]];
    for (int i = 1; i < searchComoponents.count; i++) {
        [format appendFormat:@" AND SELF CONTAINS[c] \"%@\"",[NSString stringWithFormat:@"%@",searchComoponents[i]]];
    }
    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%@",format]];
    NSArray *filtered = [objects filteredArrayUsingPredicate:predicate];

簡単な説明:SELFは配列内の現在のオブジェクトであり、証明する必要がありますCONTAINS。左のオブジェクトに右のオブジェクトが含まれているかどうかを確認し、[c]すべて大文字と小文字を区別しません。したがって、searchString 内のすべてのキーワードについて、条件を predicateformat に追加すると、最後に、次の形式の NSPredicate が必要になります: SELF CONTAINS[c] object1 AND SELF CONTAINS[ c] object2 .... 最後の行は、この NSPredicate を使用してフィルター処理された配列を作成します。predicateFormat の詳細については、こちらを参照してください

于 2013-08-05T13:01:42.483 に答える
0

おそらく、NSString "Banana One (Yellow)" を配列 ("Banana"、"One"、"(Yellow)") に分割し、それらの 1 つが検索テキストに含まれているかどうかを確認する必要があります。

    NSString *searchText = @"One";
    NSString *txt = @"Banana One (Yellow)";
    NSArray* splitString = [txt componentsSeparatedByString:@" "];
    for(int i = 0; i < [splitString count]; i++){
        if([[splitString objectAtIndex:i] rangeOfString:searchText].location != NSNotFound) {
            return txt;
        }
    }
于 2013-08-05T11:56:04.247 に答える