Objective c 调用numberOfRowsInSection中的TableView开始更新

Objective c 调用numberOfRowsInSection中的TableView开始更新,objective-c,ios,uitableview,nsfetchedresultscontroller,Objective C,Ios,Uitableview,Nsfetchedresultscontroller,我有一个由NSFectchedResultsController支持的表视图,当我没有FRC的结果时,我试图显示一个自定义单元格。我遇到的问题是,BeginUpdate会在节中调用numberOfRowsInSection。我希望保持tableview处于活动状态(而不仅仅是在其位置显示图像),以便用户可以执行拉刷新 守则: - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)secti

我有一个由NSFectchedResultsController支持的表视图,当我没有FRC的结果时,我试图显示一个自定义单元格。我遇到的问题是,BeginUpdate会在节中调用numberOfRowsInSection。我希望保持tableview处于活动状态(而不仅仅是在其位置显示图像),以便用户可以执行拉刷新

守则:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([self.fetchedResultsController.fetchedObjects count] == 0) {
    if (!specialCellShowing) {
        specialCellShowing = TRUE;
        [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView endUpdates];
    }
    return 1;
}
else {
    if (specialCellShowing) {
        specialCellShowing = FALSE;
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView endUpdates];
    }
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    return [self.fetchedResultsController.fetchedObjects count];
}
}

问题是返回1;陈述第一次调用numberOfRowsInSection时,它会设置specialCellShowing=TRUE并点击begin updates,从而调用numberOfRowsInSection。该方法的begin updates实例看到specialCellShowing为true,并返回1和exits。现在执行insert调用,然后endUpdates发生崩溃,因为tableview认为表中有1个单元格,插入了1个单元格,之前有1个单元格。另一个问题是我需要返回1,因为在随后调用numberOfRowsInSection时,我希望它不要弄乱表,只返回一个自定义单元格


我想我想知道的是,是否有更好的方法来实现这一点?

在tableview更新其显示时,不能对tableview进行变异。除非修改tableview,否则不需要调用deleteRowsAtIndex路径。您需要有一个单独的方法:一个响应事件并改变tableview数据的方法(可能调用begin/endUpdates并添加或删除行)-numberOfRowsInSection应该只检查支持数据并返回答案。tableview此时正在进行完全更新,因此在tableview中添加和删除行在此时无论如何都是无用的。

您实际上可以对其进行修改。我有一些非常简陋的代码在做这件事,插入和删除在某些情况下工作。我应该这样做吗?可能不会。我会研究你的建议。我想我只是需要摆脱我所想的那种心态,不要直接在“NumberRowSecurity”中添加或删除单元格。充其量你是在玩火。在numberOfRowsInSection期间,您可以随意修改模型,但当您直接获得cellForRowAtIndexPath:方法后,返回的数字将用作最大索引。MVC要求您应该根据事件改变模型,然后告诉视图它需要更新。您不应该在视图更新期间改变模型。完全理解。您是否可以为我指出一个方向,让我了解更多关于视图更新周期的信息(例如,以何种顺序调用哪些方法?)。基本上,听起来我需要监听更新完成,根据需要修改表,这将创建我自己的更新。那么我应该很好吗?这里: