我已将SearchBar功能添加到我的tableview中。(注意我将SearchBar拖到View而不是TableView上)。我有以下子进程,当它到达NSRange函数时抛出异常错误以使程序崩溃。以下是我的SearchBar
方法。你能看到任何可能导致错误的东西吗? (我在下面列出了摘录表格调试屏幕)
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if (searchText.length==0){
boolIsFiltered = NO;
}
else
{
boolIsFiltered = YES;
arrayFilteredproducts = [[NSMutableArray alloc]init];
for (NSString *str in arrayProducts) {
NSRange stringRange = [str rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (stringRange.location!=NSNotFound){
[arrayFilteredproducts addObject:str];
}
}
}
}
以下是创建arrayProducts
的方法。
- (void)request:(SFRestRequest *)request didLoadResponse:(id)jsonResponse {
NSMutableArray *records = [jsonResponse objectForKey:@"records"];
arrayProducts = records;
[self.tableProducts reloadData];
}
以下是调试屏幕中的转储:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM rangeOfString:options:]: unrecognized selector sent to instance 0x176c5a80 First throw call stack:
(0x30076f8b 0x3a5166af 0x3007a927 0x3007920b'
答案 0 :(得分:1)
您应该检查JSON响应实际上是关键字"记录"的对象的字符串数组。 您可以在代码中放置断点并在控制台中输入" po jsonResponse",以查看json响应的样子。我认为你期待回应看起来像......
{ "records" : [ "aString" , "anotherString", "so on" ] }
但我担心json数据可能看起来更像......
{ "records" : [ {...}, {...}, {...} ] }
因此,而不是键的对象"记录"像你想象的那样是一个字符串数组,它更像是一个字典数组。从您收到的运行时错误中可以看出这一点。
你可以为你的代码添加更多逻辑来补偿,正如neilco已经指出的,一个好的方法是在调用rangeOfString之前检查str实际上是NSString的一个实例:options:
if ( [str isKindOfClass:[NSString class]] )
{
// code in here
}
答案 1 :(得分:0)
答案在异常消息中:
' - [__ NSDictionaryM rangeOfString:options:]:无法识别的选择器
这表示str
是NSDictionary
。在致电str
NSString
实际上是rangeOfString:options:
的实例