2013-01-19 116 views
0

感謝這些SO的幫助,我有一個很好的UISearchBar來過濾我的UITableView。還有一個我想添加的功能。在搜索UITableView時忽略特殊字符的UISearchBar單元格

我希望UISearchBar過濾器忽略撇號,逗號,短劃線等特殊字符,並且允許帶有「Jim's Event」或「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]; 
    } 
} 
} 

任何人有什麼想法?謝謝!

回答

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"]strippedSearch代替searchText

在你的榜樣,這會:

  • 翻譯搜索字符串「吉姆的事件」到「JimsEvent」(剝離部分空間)
  • 翻譯項目「吉姆的事件」到「JimsEvent」(剝撇號和空間)
  • 匹配兩個,因爲他們是相同的字符串

你可能會考慮剝離不需要的字符搜索文本一次,你遍歷項目名稱之前,拉澤而不是在循環的每一次迭代中重做相同的工作。您還可以使用除alphanumericCharacterSet以外的集合來過濾更多或更少的字符 - 請參閱更多的類參考。

編輯:我們需要使用自定義函數來擺脫給定集合中的所有字符。僅使用-[NSString stringByTrimmingCharactersInSet:]只有來自的過濾器結束的字符串,而不是字符串中的任何地方。我們通過將原始字符串拆分爲不需要的字符(將它們放入進程中),然後使用空字符串重新加入組件。

+0

謝謝蒂姆!我會盡快嘗試! – Brandon

+0

掛上 - 只是意識到錯誤。編輯... – Tim

+0

我會堅持這兩個if語句之一嗎?或.m文件中的其他位置? – Brandon