1

SOのサポートのおかげで、UITableViewをフィルタリングする優れたUISearchBarができました。追加したい機能がもう1つあります。

UISearchBarフィルターで、アポストロフィ、コンマ、ダッシュなどの特殊文字を無視し、ユーザーが「Jims Event」と入力した場合でも、「Jim'sEvent」や「Jims-Event」などのテキストを含むセルを表示できるようにします。 。

for (NSDictionary *item in listItems)
{

if ([scope isEqualToString:@"All"] || [[item objectForKey:@"type"]  
isEqualToString:scope] || scope == nil)
{
    NSStringCompareOptions opts = (NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch);
    NSRange resultRange = [[item objectForKey:@"name"] rangeOfString:searchText
                                                     options:opts];
    if (resultRange.location != NSNotFound) {
    [filteredListItems addObject:item];
    }
}
}

誰かアイデアはありますか?ありがとうございました!

4

1 に答える 1

2

これは少し注意が必要です。頭に浮かぶ最初の解決策は、検索文字列とアイテム文字列の両方から意図的に一致させたくない文字をすべて削除してから、比較を行うことです。NSCharacterSetインスタンスを使用して、そのフィルタリングを行うことができます。

// Use this method to filter all instances of unwanted characters from `str`
- (NSString *)string:(NSString *)str filteringCharactersInSet:(NSCharacterSet *)set {
    return [[str componentsSeparatedByCharactersInSet:set]
            componentsJoinedByString:@""];
}

// Then, in your search function....
NSCharacterSet *unwantedCharacters = [[NSCharacterSet alphanumericCharacterSet] 
                                      invertedSet];
NSString *strippedItemName = [self string:[item objectForKey:@"name"] 
                 filteringCharactersInSet:unwantedCharacters];
NSString *strippedSearch = [self string:searchText
               filteringCharactersInSet:unwantedCharacters];

ストリップされた文字列を取得したら、の代わりに、の代わりにを使用して検索を実行できstrippedItemNameます。[item objectForKey:@"name"]strippedSearchsearchText

あなたの例では、これは次のようになります。

  • 検索文字列「JimsEvent」を「JimsEvent」に翻訳します(スペースを削除します)
  • アイテム「Jim'sEvent」を「JimsEvent」に翻訳します(アポストロフィとスペースを削除します)
  • それらは同じ文字列なので、2つを一致させます

ループを繰り返すたびに同じ作業をやり直すのではなく、アイテム名をループする前に、検索テキストから不要な文字を1回削除することを検討してください。-以外のセットを使用して、より多くの文字またはより少ない文字をフィルタリングすることもできますalphanumericCharacterSet。詳細については、クラスリファレンスを参照してください。

編集:指定されたセット内のすべての文字を削除するには、カスタム関数を使用する必要があります。文字列のどこにも使用せず、文字列の-[NSString stringByTrimmingCharactersInSet:]からのフィルタのみを使用します。これを回避するには、元の文字列を不要な文字で分割し(プロセスでそれらを削除し)、空の文字列でコンポーネントを再結合します。

于 2013-01-19T23:29:21.137 に答える