在TableView上执行搜索后,应用程序崩溃

时间:2012-11-16 14:31:45

标签: json uitableview crash uisearchbar

我目前正在尝试按照本教程实现搜索。 http://www.appcoda.com/how-to-add-search-bar-uitableview/ 但是,我正处于我的应用程序崩溃的程度,但我不知道如何修复它。

来到我的应用程序的JSON,目前只有一行数据(我无法更改它,因为我没有数据库访问权限。)

我的初步观点看起来不错。填充TableView(包含1行)。当我点击搜索栏并输入一些不在该项目名称中的字符时,我会看到正常的“找不到结果”屏幕。 当我输入项目名称中的任何字符时,它会按预期显示过滤项目。但是,当我输入第二个字母,即项目名称时,我的应用程序崩溃,在控制台中提供以下输出。

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (1)'

现在我的代码。 numberOfRowsInSection方法根据搜索进行修改。

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [searchResults count];


    } else {
        return [[resultSearch valueForKeyPath:@"data.auctions"]count];
        }
}

numberOfSectionsInTableView只有一个部分是硬编码的(返回1;因为我目前不需要更多)

现在我的cellForRowAtIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

        static NSString *simpleTableIdentifier = @"SimpleTableItem";
        SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; //custom cell

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];

        }


        NSDictionary *aucdict = [jsonAukResultsSearch objectAtIndex:indexPath.row]; //assigning current row from NSMutableArray(jsonAukResultsSearch) to Dictionary, this is probably crash spot
        NSURL *imageURL = [NSURL URLWithString:[aucdict objectForKey:@"img_url"]];
        NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//sending request to get picture
        UIImage *imageLoad = [[UIImage alloc] initWithData:result];
        NSString *timeString = [aucdict objectForKey:@"time_left"];
        NSString *priceString = [aucdict objectForKey:@"current_value"];


        // Configure the cell...
        if (tableView == self.searchDisplayController.searchResultsTableView) {
            cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
        } else {
            cell.nameLabel.text = [aucdict objectForKey:@"name"];
        }

        //cell.thumbnailImageView.image = imageLoad;
        //commented while crashes are happening


        return cell;
    }

现在,在我的应用程序崩溃后,我的行

NSDictionary *aucdict = [jsonAukResultsSearch objectAtIndex:indexPath.row];

是荧光笔,所以我猜,这可能就是放置,其中indexPath参数超出范围。我真的不明白index(1)如何超越界限(1)。我知道,我只有零个或一个返回行(取决于搜索短语)。

我今天刚刚开始搜索,所以我没有任何线索,那些棘手的问题是什么..任何建议都赞赏:)谢谢你,Yanchi

编辑:好的,所以我发现我的问题可能在哪里......我正密切关注这个问题顶部提到的教程。这个方法应该返回带有搜索结果的数组。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{

    NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"SELF contains[cd] %@",
                                    searchText];

    searchResults = [poleMien filteredArrayUsingPredicate:resultPredicate];
    NSLog(@"%u",[searchResults count]);
}

我添加了NSLog,你可以看到......现在当我添加匹配的第一个字母时,控制台输出为1(应该是这样),所以我的过滤结果将显示没有问题。但是,当我输入另一个匹配的字母时,我的searchResults数组将增加到2(好像它会计算“匹配”字母),这可能是原因,为什么我会崩溃(尝试访问索引1,而我只有一个数据)我的searchResults数组中的项目)

之后我更改了我的NSLog以显示数组的内容...插入匹配的字母后,相同的项目被添加到我的数组中(所以我的数组中有另一个项目,与我的数组中的第一项具有相同的数据)

编辑2:好的,所以我的问题是,每当我将json数据从字典保存到数组(这样我就可以使用数组来过滤结果)我在cellForRowAtIndexPath中执行它。所以我的数组得到相同的值时间,搜索表是“重新填充”..现在我需要找到一些方法将数据加载到数组中,只有它是不同的项目。

1 个答案:

答案 0 :(得分:0)

好吧最后我发现了什么是错的。我将json响应的名称字段保存到数组中。我的数组正在使用cellForRowAtIndexPath进行更新,所以在搜索框中输入两个与我的结果匹配的字母后,结果被保存到数组中两次(所以我的数组中有2个相同的项目)因此我崩溃了,因为索引超出界限

我通过检查我的数组是否包含相同的值并将唯一值保存到另一个数组中来修复它。

newarray = [[NSMutableArray alloc] init];
    NSString *laststring = nil;
    for (NSString *currentstring in poleMien)
    {
        if (![currentstring isEqualToString:laststring]) [newarray addObject:currentstring];
        laststring = currentstring;
    }

感谢eyebrowsoffire,你向我展示了正确的方法:)