7

我有一个UITabbar带有多个控制器的。其中一个控制器用于向 Core Data 添加事件,而另一个控制器用于在 UITableView 中使用NSFetchedResultsController.

这是我想要实现的行为:消失后, UITableView 停止更新,当用户回来时,重新加载整个表格视图。否则,从另一个控制器插入事件需要更长的时间,因为在 中创建新行UITableView,即使它不可见。

我想知道如何实现这种行为,因为它似乎不像我预期的那样工作:

我已将 NSFetchedResultsController 的委托设置为 nil in viewWillDisappear,并将其恢复为 in viewWillAppear,同时调用[UITableView reloadData];

不知何故,我没有看到新数据,并且怀疑这是由于 NSFetchedResultsController 在没有委托的情况下停止获取的方式。

如何正确地将更新“暂停”到UITableView它消失时,但在控制器重新出现时仍然能够看到整个数据集?

4

4 回答 4

7

在将其委托设置回 后尝试发送performFetch:NSFetchedResultsControllerin 。viewWillAppear:self

于 2012-11-02T00:09:07.947 回答
2

我认为您不必“暂停”表格视图更新。无论如何, AUITableView只会从可见NSFetchedResultsController单元格中请求数据。如果表格视图不可见,则不会触发任何更新。

您是否测试过从另一个控制器插入事件是否真的需要更长的时间?我对此表示怀疑。仪器说什么?

如果您的委托方法被触发,您仍然可以在进行任何更新之前检查表视图是否可见。

之后,您完全按照 rob 的建议进行操作:do a performFetch:in viewWillAppear:

于 2012-11-02T11:37:17.000 回答
0

尝试将 of 的对象设置为 nil,delegateNSFetchedResultsController不是将 的 设置为 nilviewWillDisappearNSFetchedResultsController

于 2012-11-02T00:06:50.113 回答
0

这种粗暴的做法怎么样?没有测试它。

@property (nonatomic) BOOL bruteForceReload;

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.bruteForceReload = NO;
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    self.bruteForceReload = YES;
}

-(void)setBruteForceReload:(BOOL)bruteForceReload {
    _bruteForceReload = bruteForceReload;
    if (_bruteForceReload) {
        [self.tableView reloadData];
    }
}

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

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    if (!self.bruteForceReload) {
        switch(type) {
            case NSFetchedResultsChangeInsert:
                [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
                break;

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

            default:
                return;
        }
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    if (!self.bruteForceReload) {
        UITableView *tableView = self.tableView;

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

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

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

            case NSFetchedResultsChangeMove:
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;
        }
    }
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    if (!self.bruteForceReload) {
        [self.tableView endUpdates];
    } else {
        [self.tableView reloadData];
    }
}
于 2015-09-30T16:53:46.567 回答