我在我的应用程序中使用 Core Data,并NSFetchedResultsController
在表格视图中使用它。我可以对单元格/数据执行各种操作,例如向左或向右滑动以分别删除或将单元格标记为已读(这也会删除数据)。
在我说的情况下,将单元格标记为已读(这也将相应的核心数据对象的isRead
属性设置为YES
),我希望单元格在视觉上更新以表明这一点。视觉更新使单元格看起来已阅读(就像已读与未读电子邮件的样子)。
我怎么会发生这种情况?(当对应的对象有属性变化时更新单元格,即。)
我在这个委托方法中尝试了NSFetchedResultsController
:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:(ArticleCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
并且NSFetchedResultsChangeUpdate
是被选中的情况,configureCell:
然后被调用,它看起来像这样:
- (void)configureCell:(ArticleCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
Article *article = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.article = article;
}
它调用我的UITableViewCell
子类,ArticleCell
的自定义article
属性设置器。在那种方法中,我基本上从以下开始:
- (void)setArticle:(Article *)article {
if (_article != article) {
将要设置的新文章与单元格的现有文章进行比较(因此只有在发生更改时才会更新)。但是,这个 if 语句中的代码永远不会被调用!它跳过去并存在该方法。在该 if 语句中,我拥有所有自定义代码来根据该文章的属性(、、等)设置单元格的isRead
外观kind
。
我应该如何处理这个?我只希望每当与该单元格对应的对象有更新时,该单元格就会反映该更新。无论是读取状态的变化,还是其他什么。