ios / xcode /核心数据:更新屏幕的最佳方式

时间:2015-04-13 19:08:36

标签: ios delegates nsfetchedresultscontroller

网络程序员试图学习ios。我有一个我觉得很常见的设置。表格视图,详细信息屏幕,添加新项目屏幕和编辑项目屏幕。

遵循各种教程,我将数据更改保存到托管对象上下文,因此保存持久性存储。那部分工作正常。但是,我试图使用委托模式使屏幕反映更改并且屏幕不更新(表视图和详细视图都没有。)详细视图通过导航BTW呈现,添加和编辑屏幕是模态的

让屏幕更新的正确方法是什么?

我已尝试过所有内容,因此从表视图中获取代码只是我尝试过的一个示例...将表视图控制器声明为委托并实现所需方法但我明显遗漏了一些内容:

 @interface IDTVC : UIViewController<UITableViewDataSource, UITableViewDelegate,NSFetchedResultsControllerDelegate>
    @property (strong, nonatomic) IBOutlet UITableView *tableView;
    @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

in .m file:

in nsfetchedresultscontroller
 self.fetchedResultsController.delegate=self;

in view will appear

[[self tableView] reloadData]; 

如果有可接受的方式或其他任何建议,请详细说明如何执行此操作。

2 个答案:

答案 0 :(得分:0)

由于您正在使用委托,因此如果您要添加一行,则可以使用-tableView:insertRowsAtIndexPath:。如果您正在编辑一行,则可以使用-tableView:reloadRowsAtIndexPath:。在委托方法中添加这些,因此当您添加某些内容时,它会触发其中一种方法。

答案 1 :(得分:0)

我试图在文档中依赖Apple的声明来实现NSFetchedResultsController协议“委托必须实现至少一个更改跟踪委托方法才能启用更改跟踪。提供controllerDidChangeContent的空实现:就足够了。“

这表示上述不稳定的行为,即它最多可以工作9,然后停止更新。

解决方案是使用文档中的完整代码:

/*
 Assume self has a property 'tableView' -- as is the case for an instance of a UITableViewController
 subclass -- and a method configureCell:atIndexPath: which updates the contents of a given cell
 with information from a managed object at the given index path in the fetched results controller.
 */

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


- (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)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];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                       withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


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