当tableview结束显示单元格时如何更改为读取状态?

Posted

技术标签:

【中文标题】当tableview结束显示单元格时如何更改为读取状态?【英文标题】:How to change as read state when tableview did end displaying cell? 【发布时间】: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)

有什么想法吗?

【问题讨论】:

【参考方案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。

以上是关于当tableview结束显示单元格时如何更改为读取状态?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 选择单元格时所有组件都更改了背景颜色

点击时突出显示 tableview 单元格,按下警报控制器操作按钮时取消突出显示

重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)

添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

选择 TableView 单元格时无法显示另一个 ViewController

当我单击 tableview 单元格时,UITextfield 没有显示文本?