2012-07-14 50 views
1

我想實現搜索我的應用程序。如果你在搜索欄中寫了一個確切的單詞,那沒關係,但是例如,如果我想找到「book」,並且輸入「böök」變音符號應該不重要。我正在使用下面的代碼,但它沒有用,而且在搜索時也失敗了,例如「紐約 - 比約克」。我也嘗試過不同的searchEditedText組合,但代碼變得噁心。我怎樣才能做到這一點?如何在搜索時忽略unicode字符?

NSString *searchText = [searchBar.text capitalizedString]; 
NSString *searchEditedText=[searchBar.text capitalizedString]; 
NSMutableArray *searchArray = [[[NSMutableArray alloc] init] autorelease]; 
for (NSDictionary *dictionary in listOfItems) { 
    NSArray *array = [dictionary objectForKey:@"Names"]; 
    [searchArray addObjectsFromArray:array]; 
} 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"u" withString:@"ü"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"c" withString:@"ç"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"U" withString:@"Ü"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"C" withString:@"Ç"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"o" withString:@"ö"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"O" withString:@"Ö"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"g" withString:@"ğ"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"G" withString:@"Ğ"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"s" withString:@"ş"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"S" withString:@"Ş"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"i" withString:@"ı"]; 
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"İ" withString:@"I"]; 
for (NSString *sTemp in searchArray) { 
    NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
    NSRange titleResultsRange2 = [sTemp rangeOfString:searchEditedText options:NSCaseInsensitiveSearch]; 
    if (titleResultsRange2.length > 0 || titleResultsRange.length > 0) { 
    [copyListOfItems addObject:sTemp]; 
    } 
} 

回答

4

如果你使用的核心數據,你可以使用的情況下和變音符號不敏感的方式搜索其中的NSPredicate。在this question答案正在執行不區分大小寫的搜索,如果你添加[cd]作爲比較的一部分例如contains[cd]==[cd],那麼它將執行情況和變音符號不敏感的搜索。

+0

我不使用核心數據,我看這個問題的答案,但我認爲它並不能解決「O-O,U-U,......等等」?儘管如此,我試過了,它沒有奏效。 – David 2012-07-14 11:06:37

+0

那麼NSPredicate搜索只適用於核心數據,所以使用它的東西是不是這樣,將無法正常工作。你應該與你使用搜索已經即信息的機制的細節你的問題是擴大你目前正在使用搜索數據存儲在SQLite數據庫還是其他什麼東西,什麼機制中的數據。 – Petesh 2012-07-14 12:58:43

+0

謝謝,我擴展了我的問題。另外,如果有一個解決方案「寫'böök',找到'書''與核心數據,我可以使用它沒有問題。 – David 2012-07-14 13:46:04

2

事實上,你可以這樣做:

NSPredicate *謂詞= [NSPredicate predicateWithFormat:@ 「名包含的[CD]%@」,SEARCHTEXT]。

searchArray = [[LISTOFITEMS filteredArrayUsingPredicate:謂詞] mutableCopy];

因爲NSPredicate可以忽略unicode的,那麼,該searchArray是你想要的。

1

你嘗試只是把現有的代碼,並與

NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch|NSWidthInsensitiveSearch 

更換的

NSCaseInsensitiveSearch 

所有實例?這似乎可以以最直接的方式解決您的問題。

如果你想böök匹配book反之,則見this answer一種方式尋找它之前剝離的böök的區別標記。但是這很容易出錯,而且可能不是你真正想要做的。

相關問題