0

我在我的应用程序中实现了一个 UISearchBar,当我点击清除按钮并且找到一个项目时它会崩溃。就像我输入一些字符,应用程序搜索并显示 1 项,但是当我清除搜索时,它崩溃了。

我搜索了stackoverflow,我知道问题出在保存搜索项的数组上,因为当我点击清除按钮时,数组变为空并且tableview索引path.row无法显示。

此外,如果搜索没有返回任何项目并且我点击了清除按钮,我会收到一条类似的错误消息,这一次购买说我得到了一个空数组。

该应用程序停在这里:

NSDictionary *itemAtIndice =(NSDictionary *)[filteredCodigos objectAtIndex:indexPath.row];

问题是我根本不知道该怎么办!!!

这是错误:

 Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

这是我的代码::

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if (searchText.length == 0) {
    isFiltered = NO;
} else {
    isFiltered = YES;
    filteredCodigos = [[NSMutableArray alloc]init];


    for (NSDictionary *item in values) {
        NSString *string = [item objectForKey:@"NAME"];

        NSRange stringRange = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];

        if (stringRange.location != NSNotFound) {
            [filteredCodigos addObject:item];
        }
    }
}
[self.tableView reloadData];
}


- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self.Pesquisa resignFirstResponder];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (isFiltered) {
        return [filteredCodigos count];

    }

    return values.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath    *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"   forIndexPath:indexPath];

NSDictionary *itemAtIndex =(NSDictionary *)[values objectAtIndex:indexPath.row];
NSDictionary *itemAtIndice =(NSDictionary *)[filteredCodigos objectAtIndex:indexPath.row];

if (!isFiltered) {
    cell.textLabel.text = [itemAtIndex objectForKey:@"SYMBOL"];
    cell.detailTextLabel.font = [UIFont systemFontOfSize:10];
    cell.detailTextLabel.text = [itemAtIndex objectForKey:@"NAME"];
} else {
        cell.textLabel.text = [itemAtIndice objectForKey:@"SYMBOL"];
        cell.detailTextLabel.font = [UIFont systemFontOfSize:10];
        cell.detailTextLabel.text = [itemAtIndice objectForKey:@"NAME"];
       }
return cell;
}
4

2 回答 2

1

filteredCodigos在外部声明searchBar:textDidChange:并在多个地方使用,但分配给 in searchBar:textDidChange:。最有可能的是,其他一些代码正在尝试访问filteredCodigos未分配或为空的成员。启用异常断点将帮助您跟踪它。

作为旁注。您可能会查看 NSPredicate 来过滤您的项目而不是 for 循环。

于 2013-01-07T05:22:36.313 回答
0

终于设法解决了这个问题。

我刚刚在给我错误的行替换了 indexPath.row 为 lastObject :

所以,之前:

NSDictionary *itemAtIndice =(NSDictionary *)[filteredCodigos objectAtIndex:indexPath.row];

之后:

NSDictionary *itemAtIndice =(NSDictionary *)[filteredCodigos lastObject];
于 2013-01-07T06:07:31.260 回答