回答感谢所有帮助。我是新的堆栈溢出,所以如果我的编辑是凌乱我道歉。下面的代码是我最终想出来的,并认为它可以帮助其他人,虽然我相信最后回答的人也可能产生类似的结果。
我一直在寻找一段时间,我相信我可以打破这一点并用一些草率的if语句来完成它,但我正在寻找一种通用,有效的方法。
我有一个典型的字符串比较搜索。对于使用NSRange
的数组中的每个字符串,但我从中得到的结果可能很挑剔。
如果我有一个字符串,例如Bat Man
我可以通过搜索Bat
或Man
找到它,但不能在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];
}
答案 0 :(得分:0)
您可以使用谓词来解决此问题。它们在过滤数组时非常方便。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Self contains[c] %@",self.searchString.text];
NSArray *filteredArray = [self.superHeroesArray filteredArrayUsingPredicate:predicate];
在[c]
之后添加contains
可确保搜索不区分大小写。