iOS9.1中的方法崩溃之前有效。它来自
(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
方法是
- (void)filterContentForSearchText:(NSString*)searchText
{
[self.searchResults removeAllObjects]; // First clear the filtered array.
for (NSArray *contactsInSection in self.sections)
{
for (Contact *contact in contactsInSection)
{
NSArray *substringArray = [[contact displayName] componentsSeparatedByString:@", "];
for (NSString *substring in substringArray)
{
NSComparisonResult result = [substring compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[self.searchResults addObject:contact];
break;
}
}
}
}
}
崩溃的行是比较的行:[substring compare:searchText ....];
使用iPhone6设备在iOS9.1中出现问题。适用于iPhone5 !!!
以下是编译器的截图
答案 0 :(得分:2)
问题在于你的范围
range:NSMakeRange(0, [searchText length])];
比接收器长:searchText = @"Po"
长度为2个字符,而substring = @"n"
长度只有1个字符。因此,该方法将引发异常:
range :执行比较的接收器范围。 范围不得超过接收器的范围。
重要
如果范围超出接收器的范围,则引发NSRangeException。
(参考:iOS API reference)
也许您应该首先查看searchText.length <= substring.length
?