助けてくれたすべての人に感謝します。投稿に関してはスタックオーバーフローが初めてなので、編集が面倒な場合はお詫び申し上げます。以下のコードは私が最終的に思いついたものであり、他の人を助けるかもしれないと思いますが、最後に答えた人も同様の結果をもたらす可能性があると思います.
私はしばらく探していましたが、これを分解して、ずさんな if ステートメントをいくつか使用して実行できると確信していますが、一般的で効率的な方法を探しています。
典型的な文字列比較による検索があります。を使用して配列内の各文字列に対して を使用してNSRange
いますが、そこから得られる結果はうるさい場合があります。
たとえば、文字列がある場合Bat Man
、検索することで見つけることができますがBat
、forMan
に追加することはできませm
ん。bat
Batm
私が探しているのは、文字が文字列内に存在し、正確にその文字列ではない場合です。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
[roomsList removeAllObjects];
stringScore = 0;
// clear
if([searchText length] == 0){
searchingRooms = NO;
[roomsList addObjectsFromArray:[newDataManager shared].rooms];
[self.gsgSearchBar resignFirstResponder];
// search users
}else{
searchingRooms = YES;
for(QBChatRoom *room in [newDataManager shared].rooms){
stringScore = 0;
NSString* newRoomNameText = [room.name stringByReplacingOccurrencesOfString:@"_" withString:@""];
NSString* newSearchText = [searchText stringByReplacingOccurrencesOfString:@" " withString:@""];
for(int i = 0 ;i<[newSearchText length]; i++) {
char mySearchChar = [newSearchText characterAtIndex:i];
lastSearchString = [NSString stringWithFormat:@"%c",mySearchChar];
NSRange searchRange = [newRoomNameText rangeOfString:lastSearchString options:NSCaseInsensitiveSearch];
if (searchRange.location != NSNotFound){
stringScore = stringScore + 1;
if (stringScore == newSearchText.length) {
[roomsList addObject:room];
}
}}}}
[gsgTableView reloadData];
}