0

我有一个方法的这一部分给我一个错误。这是一个单词过滤器,用户键入 a,所有单词都出现,等等......

当用户删除搜索栏文本并单击表格上的某些内容时出现错误,我超出范围异常。

filtersListContent 的打印输出是单个“”条目,我应该如何防止“”使程序崩溃?

谢谢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if ([_filteredListContent count]>0){
        NSLog(@"%i",indexPath.row);
        NSLog(@"%@",_filteredListContent);
        _searchBar.text=[self.filteredListContent objectAtIndex:indexPath.row];
        //Save to user default
4

3 回答 3

2

我不确定是什么导致了您的问题,但从给出的代码看来,所选行似乎是“越界”。我会改变我的支票:

[_filteredListContent count] > 0

类似于:

[_filteredListContent count] > indexPath.row

同样,这只是基于给定的代码。

于 2013-01-23T04:45:23.690 回答
1

我猜您正在使用搜索显示控制器在表格中进行搜索。但同时您对两个表使用相同的数组引用(self.filteredListContent)(一个是搜索结果表,另一个是用于显示所有单词的原始表)。当您在搜索栏中键入字符时,您正在修改 self.filteredListContent 数组。这就是为什么当您搜索 self.filteredListContent 被修改的东西(可能包含的对象少于用于加载原始表的对象)然后您选择原始表的任何行时,如果您尝试访问数组中不存在的索引处的对象,它将崩溃.

所以我建议你保留两个数组。一个用于加载原始表和一个用于搜索结果表

于 2013-01-23T04:43:06.357 回答
-1

以下是单词过滤器的简单示例。

-(void)viewDidLoad
{
    self.listOfTemArray = [[NSMutableArray alloc] init];
    self.ItemOfMainArray = [[NSMutableArray alloc] initWithObject:@"/ArrayList/"];

    [self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray];
}


#pragma mark -
#pragma mark Table view Methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView {
    // Return the number of sections.
    return 1;
}
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [self.listOfTemArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Foobar"];

        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.textLabel.textColor = [UIColor blackColor];
    }

        cell.textLabel.text = [self.listOfTemArray objectAtIndex: indexPath.row];

    return cell;
}

#pragma mark -
#pragma mark SearchBar methods

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText
{
        NSString *name = @"";
        NSString *firstLetter = @"";

    if (self.listOfTemArray.count > 0)
         [self.listOfTemArray removeAllObjects];

        if ([searchText length] > 0)
        {
                for (int i = 0; i < [self.ItemOfMainArray count] ; i = i+1)
                {
                        name = [self.ItemOfMainArray objectAtIndex:i];

                        if (name.length >= searchText.length)
                        {
                                firstLetter = [name substringWithRange:NSMakeRange(0, [searchText length])];
                                //NSLog(@"%@",firstLetter);

                                if( [firstLetter caseInsensitiveCompare:searchText] == NSOrderedSame )
                                {
                                    // strings are equal except for possibly case
                                    [self.listOfTemArray addObject: [self.ItemOfMainArray objectAtIndex:i]];
                                    NSLog(@"=========> %@",self.listOfTemArray);
                                }
                         }
                 }
         }
         else
         {
             [self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray ];
         }

        [self.tblView reloadData];
}

此代码在您的情况下可能有用...

谢谢:)

于 2013-01-23T04:56:09.257 回答