【问题标题】:How to change as read state when tableview did end displaying cell?当tableview结束显示单元格时如何更改为读取状态?
【发布时间】:2013-12-13 17:56:43
【问题描述】:

我尝试创建一个聚合提要的应用程序。

我想在表格视图结束显示单元格时更改提要状态。

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    Feed* feed = [_fetchedResultsController objectAtIndexPath:indexPath];
    if ([feed.read boolValue] == YES) return ;
    feed.read = [NSNumber numberWithBool:YES];
    [Feed save];
}

我使用 NSFetchedResultsController,当我更改提要状态时,我使用 reloadRowsAtIndexPath。

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

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
    {
        switch(type) {
            ...
            case NSFetchedResultsChangeUpdate:
                [self.tableView reloadRowsAtIndexPaths:@[indexPath]
                                      withRowAnimation:UITableViewRowAnimationAutomatic];
                break;
            ...
        }
    }

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

我滚动,didEndDisplayingCell 与良好的indexPath 一起调用,当tableView 结束更新时,它再次调用didEndDisplayingCell 与下一个indexPath。之后,我的核心数据出现了严重错误。

CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  *** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2] with userInfo (null)

有什么想法吗?

【问题讨论】:

    标签: ios iphone core-data nsfetchedresultscontroller


    【解决方案1】:

    为什么要在didEndDisplayingCell 中更新coreData? 通过调用[Feed save],您的tableview 将再次开始更新。tableView 将调用didEndDisplayingCell,因为您重新加载刚刚更新的行。

    所以将代码放在didEndDisplayingCell 方法中的其他地方。

    【讨论】:

    • 我想更新单元格以将其状态更改为读取,但我想在 tableView 确实结束显示单元格时执行此操作。您滚动,当单元格离开屏幕时,它会更新为读取状态。我在哪里可以将代码从 didEndDisplayingCell 中取出?
    • 我认为你正在做一个像 Feedly 这样的应用程序,所以 tableView 单元格可能会显示提要的标题。因此,当人们单击单元格并按下 view controller 以显示详细信息时。如果是这样,为什么不在显示详细信息时更新读取状态,并在返回此页面时让 NSFetchedResultsController 处理其他事情。
    • 我明白你的意思,就像你说的那样,我想做一个像 feedly 这样的应用程序。此时,我想在用户滚动时更新我的​​提要。在 feedly 上有点不同,因为 feedly 有页面而不是表格视图。当您滚动到下一页时,feedly 会自动更新为阅读状态。我想在单元格不在屏幕时自动更新我的提要。
    • 好的,我认为这是您在这种情况下可以做的一种方法。创建另一个数据模型(数组、映射、设置)以将单元格的 indexPath 保存在 didEndDisplayingCell 中,以将这些单元格标记为已读。然后在cellForRowAtIndexPath再次显示这些单元格时配置单元格的读取状态。
    • 或者,删除NSFetchedResultsController的那些代码,使用NSManagedObjectContext从你的数据模型中获取数据,使用获取结果作为你的tableView的数据源。然后你可以在didEndDisplayingCell中做[Feed save];安全,因为您不需要通过 NSFetchedResultsController 更新 tableview。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多