UITableView搜索后应用程序崩溃

时间:2012-08-23 22:54:43

标签: iphone objective-c ios xcode uitableview

如果我执行此操作,我的应用会崩溃:

  1. 我在我的UITableView上搜索

  2. 搜索完成后,点击searchDisplayController UITableView的UITableViewCell,转到另一个视图控制器

  3. 然后我回到主要的UITableView questionTable - 我搜索的那个,然后点击最后一个单元格,或者任何大于我之前搜索结果数量的单元格

  4. 应用程序因此错误崩溃:

    *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 12 beyond bounds [0 .. 0]'
    *** First throw call stack:(0x35aa188f 0x37e48259 0x359ea9db 0x155fd 0x3384df5b 0x153ed 0x3358793d 0x33601627 0x355bb933 0x35a75a33 0x35a75699 0x35a7426f 0x359f74a5 0x359f736d 0x37693439 0x33503cd5 0x95a3 0x9548) terminate called throwing an exception(lldb) 
    
  5. 我怀疑问题出在我的代码上,因为搜索UITableView对我来说是个新主题。这就是我的方式:

    1.我的VC符合这些协议<UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate, UISearchBarDelegate>

    2.我有这些变量:

    @property (nonatomic, retain) NSMutableArray *searchResults;
    @property (nonatomic, copy) NSString *savedSearchTerm;
    

    3。在viewDidLoad我设置了我搜索的UITableView的源代码:

        self.questionList = [[NSArray alloc]
                         initWithObjects: MY OBJECTS HERE, nil];
    
    if ([self savedSearchTerm])
    {
        [[[self searchDisplayController] searchBar] setText:[self savedSearchTerm]];
    }
    

    4。我有这个动作来处理搜索:

    - (void)handleSearchForTerm:(NSString *)searchTerm
    {
    [self setSavedSearchTerm:searchTerm];
    
    if ([self searchResults] == nil)
    {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [self setSearchResults:array];
    }
    [[self searchResults] removeAllObjects];
    
    if ([[self savedSearchTerm] length] != 0)
    {
        for (NSString *currentString in [self questionList])
        {
            if ([currentString rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound)
            {
                [[self searchResults] addObject:currentString];
            }
        }
    }   
    }
    

    5)以下是我设置UITable视图的方法:

        (UITableViewCell *)tableView:(UITableView *)tableView 
             cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        {
        NSInteger row = [indexPath row];
        NSString *contentForThisRow = nil;
    
        if (tableView == [[self searchDisplayController] searchResultsTableView])
            contentForThisRow = [[self searchResults] objectAtIndex:row];
        else
            contentForThisRow = [[self questionList] objectAtIndex:row];
    
        static NSString *CellIdentifier = @"questionsCell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        [[cell textLabel] setText:contentForThisRow];
        return cell;
        }
    

    6)以下是我的numberOfRowsInSection方法的样子:

    (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    NSInteger rows;
    
    if (tableView == [[self searchDisplayController] searchResultsTableView])
    rows = [[self searchResults] count];
    else
    rows = [[self questionList] count];
    return rows;
    }
    

    7)最后,我有这两种方法:

    (BOOL)searchDisplayController:(UISearchDisplayController *)controller 
    shouldReloadTableForSearchString:(NSString *)searchString
    {
        [self handleSearchForTerm:searchString];
        // Return YES to cause the search result table view to be reloaded.
        return YES;
    }
    
    (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
    {
        [self setSavedSearchTerm:nil];
        [[self questionTable] reloadData];
    }
    

    对于这个冗长的问题,我真的很抱歉。我在代码中犯了一些错误,我希望有人能告诉我正确的方法。搜索栏控制器在IB中正确链接 任何帮助将非常感谢!

    新编辑: 我在didSelectRowAtIndePath上推新VC:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self performSegueWithIdentifier:@"toAnswer" sender:indexPath];
    }
    

    我正在更新NSString。当我只使用一个TableView

    时,它工作得很好
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        ((QandADetailsViewController *)segue.destinationViewController).delegate=self;
    
        NSIndexPath *indexPath = (NSIndexPath *)sender;
    
        QandADetailsViewController *mdvc = segue.destinationViewController;
    
        if (self.searchResults == nil) {
            mdvc.questionName = [self.questionList
                                 objectAtIndex:indexPath.row];
        } else {
            mdvc.questionName = [self.searchResults
                                 objectAtIndex:indexPath.row];
        }
    }
    

2 个答案:

答案 0 :(得分:3)

在准备segue时,检查searchResults == nil可能不正确。在第一次搜索之后,没有理由期望它是零。这意味着您将始终在后续表选择中取消引用搜索数组,解释索引超出范围。

我认为,修复方法是询问if ([self.searchDisplayController isActive]),而不是搜索结果是否存在。

答案 1 :(得分:1)

您的数组似乎是空的。

我建议你在每一步之后记录你的数组,这样你就可以看到它变空了。

还记录行号和方法名称,请参阅此处,如何记录:

NSLog(@"%s\n [Line: %d]\n  array:%@\n\n", __PRETTY_FUNCTION__, __LINE__, yourArray);