0

我已将 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'

4

2 回答 2

1

您应该检查 JSON 响应实际上是关键“记录”对象的字符串数组。您可以在代码中设置断点并在控制台中键入“po jsonResponse”,以查看 json 响应的样子。我认为您期望响应看起来像...

{   "records" : [ "aString" , "anotherString", "so on" ] } 

但恐怕 json 数据实际上看起来更像......

{   "records" : [ {...}, {...}, {...} ] }

因此,关键“记录”的对象不像您假设的那样是一个字符串数组,它更可能是一个字典数组。从您收到的运行时错误中可以看出这一点。

您可以在代码中添加更多逻辑以进行补偿,正如 neilco 已经指出的那样,一个好的方法是在调用 rangeOfString:options 之前检查 str 实际上是 NSString 的实例:

if (  [str isKindOfClass:[NSString class]]  )
{
   // code in here
}
于 2013-09-16T23:30:37.333 回答
0

答案在异常消息中:

'-[__NSDictionaryM rangeOfString:options:]: 无法识别的选择器

这是说那str是一个NSDictionary。你应该在调用之前检查它str实际上是一个实例NSStringrangeOfString:options:

于 2013-09-16T23:11:41.153 回答