如何刷新UITableViewController或NSFetchedResultsController?

我的UITableViewController或NSFetchedResultsController有一点问题。 我不确定哪个是问题,但我猜它是UITableViewController。

正如我所说我使用NSFetchedResultsController来填充我的数据到一个UITableViewController。 数据按日期排序,并按日期年份显示,例如2010年5月/ 2010年6月/等。 这显示为部分标题。

现在,当我添加新数据时,它会自动使用当前日期作为默认值,但如果我想使用日期,该日期目前不在节列表中,例如2010年4月(目前列表中的5月和6月),那么这是没有正确显示。 只有当我退出应用程序并重新启动时,它才会显示新节标题,并且一切正常。

所以我不知何故需要能够刷新我的列表或更新它。 只需将其添加到上下文中并更改它似乎不会更新它。

同样,我不知道我需要更新什么,如果它是我的NSFetchedResultsController对象或UITableViewController。

更新#1:

我只是觉得这个方法有个例外:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];

}

这是我移动数据的地方:

- (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:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            // Reloading the section inserts a new row and ensures that titles are updated appropriately.
            [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }

}

这种方法很大程度上取自Apple的CoreDataBooks示例。 这是错误的:

严重的应用程序错误。 在调用-controllerDidChangeContent:期间,NSFetchedResultsController的委托捕获到异常。 *** - [NSMutableArray removeObjectAtIndex:]:索引1超出边界[0..0]与userInfo(null)

之后,编辑模式(删除按钮出现)不再起作用。

谢谢。


好吧,看起来我找到了解决方案,我只是跳过这些

[self.tableView beginUpdates];
[self.tableView endUpdates];

并始终这样做。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{

[self.tableView reloadData];

}

我显然会给出一些更多的逻辑,因为只有当我想将数据移动到以前不存在的部分时才会出现问题。 在有人能给我一个真正的解决方案之前,我会用这个。


在1.2版iPhoneCoreDataRecipes中采用苹果的修补程序,正确的做法是替换

 // Reloading the section inserts a new row and ensures that titles are updated appropriately.
 [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];

    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

(FileMerge是你的朋友!)

请注意,1.2版本中还有一个修复程序,可以在创建新条目时防止错误崩溃。 我已经报道了这一点,并在两周内得到修复。 我鼓励你用Apple提交错误报告。 他们比你想象的要快得多,你可以期待得到最好的解决方案。


您需要实现controller:didChangeSection:atIndex:forChangeType: delegate方法。 在此,根据报告的更改类型,将insertSections:withRowAnimation:deleteSections:withRowAnimation:reloadSections:withRowAnimation: messages发送到您的表视图。

链接地址: http://www.djcxy.com/p/66855.html

上一篇: How to refresh a UITableViewController or NSFetchedResultsController?

下一篇: Make column compatible with Full