UITableView在搜索时崩溃

时间:2013-01-28 02:08:00

标签: ios uitableview uisearchbar

我正在尝试向我的UITableView添加搜索栏,并且在执行此代码时似乎崩溃了:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath         
   {
    Book *book = nil;

    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        NSLog(@"Configuring cell to show search results");
        book = [self.searchResults objectAtIndex:indexPath.row];
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
        }

        // Configure the cell.
        [self configureCell:cell atIndexPath:indexPath];
        return cell;
    }
    else
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        // Configure the cell.
        [self configureCell:cell atIndexPath:indexPath];
        return cell;
    }    
 }

控制台错误是:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'索引2中没有对象   索引0'

的部分
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 
  // Configure the cell to show the book's title 
  Book *book = [self.fetchedResultsController objectAtIndexPath:indexPath];   
  cell.textLabel.text = book.title; 
}

      - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {
    return [[self.fetchedResultsController sections] count];
 }


// Customize the number of rows in the table view.
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

if (tableView == self.searchDisplayController.searchResultsTableView)
{
    return [self.searchResults count];
}
else
{

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}

}

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{    
   switch(type) {

    case NSFetchedResultsChangeInsert:
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        break;
}

}

1 个答案:

答案 0 :(得分:1)

在configureCell中:你有

Book *book = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

仅在您不搜索时才有效,您应该将Book传递给configureCell而不是indexPath。

所以

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath         
   {
    Book *book = nil;

    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        NSLog(@"Configuring cell to show search results");
        book = [self.searchResults objectAtIndex:indexPath.row];
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
        }

        // Configure the cell.
        [self configureCell:cell withBook:book];
        return cell;
    }
    else
    {
        book = [self.fetchedResultsController objectAtIndexPath:indexPath];
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        // Configure the cell.
        [self configureCell:cell withBook:book];
        return cell;
    }    
 }

- (void)configureCell:(UITableViewCell *)cell withBook:(Book *)book { 
  // Configure the cell to show the book's title    
  cell.textLabel.text = book.title; 
}