0

我在我的应用程序中使用 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

我应该如何处理这个?我只希望每当与该单元格对应的对象有更新时,该单元格就会反映该更新。无论是读取状态的变化,还是其他什么。

4

2 回答 2

2

在 if 语句中,您正在比较对同一对象的两个引用,因此当从NSFetchedResultsChangeUpdate类型的更改调用 setter 时,它将始终为 true 。

您实际上并不需要 if,只需信任控制器中的代码:didChangeObject:atIndexPath:forChangeType:newIndexPath:方法,并在方法请求时始终更新单元格。

于 2013-07-08T23:31:42.173 回答
1

如果因为文章对象是相同的,它不会进入内部。但是,它的属性可能会更新。

您可能想要更改 if 或引入其他类似的方法-[ArticleCell update]来检查影响单元格外观的任何属性是否已更改。

于 2013-07-08T23:12:16.897 回答