当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 保持在相同的滚动位置