为UITableView重新排序获取结果控制器

时间:2009-07-22 20:07:00

标签: iphone

我目前正在开发一个假日期刊,如应用程序,它按照类型存储您访问过的每个地方。例如,餐馆名称应存储在“食物”部分下。我已经设法使用核心数据并创建表没有问题。但问题是每当我尝试更改某个地方的类型时(因此tableview需要重新排序),我会收到一条错误消息:

2009-07-22 21:04:58.150 HolidayTest[8662:20b] Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4) with userInfo (null)
2009-07-22 21:04:58.151 HolidayTest[8662:20b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4)'

我知道获取结果控制器的委托已经更新了表。但问题是fetch控制器没有更新自己的section和row数据。简单的方法是告诉fetch结果控制器在用户更改其类型时重新获取其数据。但是,它不是管理数据的有效方式。


谢谢你的回答TahoeWolverine。下面是我更改用户在tableview上选择行以更改其类型的位置类型的代码。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSIndexPath *selectionIndexPath = [NSIndexPath indexPathForRow:selected inSection:0];
    UITableViewCell *checkedCell = [tableView cellForRowAtIndexPath:selectionIndexPath];
    checkedCell.accessoryType = UITableViewCellAccessoryNone;

    [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];   
    selected = indexPath.row;
    NSManagedObject *aType = [siteType objectAtIndex:indexPath.row];
    self.site.type = [aType valueForKey:@"name"];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    [self.delegate TypeSelectionController:self didChangeType:YES];
}

此代码对应于获取结果控制器的委托,该委托运行以下代码

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) 
    {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }

}

- (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;
    }

}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
    [self.tableView endUpdates];
}

然后我将收到错误消息.......

1 个答案:

答案 0 :(得分:0)

很难确切地说出你的意思,但似乎你试图删除超出数组末尾的内容。很难知道你会做什么导致这种情况。

如果我要实现这个,我会

A)从表中删除条目:

[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

B)从数据结构中删除条目。

C)修改数据(标题和其他任何内容)。

D)在数据结构中添加需要的条目。

E)在表格中添加条目:

[tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];

希望有所帮助。如果你更新问题,我会留意。