0

我在我的應用程序中使用核心數據,並使用它NSFetchedResultsController在表格視圖中使用它。我可以對單元格/數據執行各種操作,例如向左或向右滑動以刪除或將單元格分別標記爲已讀(這也會刪除數據)。如何在每次更改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語句我所有的自定義代碼來設置基於該文章的性質是什麼細胞樣子(isReadkind等)

我應該如何處理被這個?我只是希望每當更新對應於該單元格的對象時,單元格都會反映更新。無論是閱讀狀態的改變,還是其他。

回答

2

在如果您要比較兩個引用同一個對象,所以當設置器從類型NSFetchedResultsChangeUpdate的變化稱爲它永遠是真實的陳述。

你並不真的需要,如果,只是信任的代碼在控制器:didChangeObject:atIndexPath:forChangeType:newIndexPath:方法並始終如果該方法要求其更新單元格。

+0

如何僅更改需要在set方法中更改的部分?或者我從頭開始設置它,好像它是一個新的單元格?這是一個很大的性能損失? –

+0

我不相信將單元格設置爲新的(例如,不檢查所有值而取代)是一個巨大的性能損失,因爲它只會以用戶可以與可見單元格交互的速度發生。但是,當然,這取決於您的模型以及您希望在單元格中顯示的數據類型/數量。 –

1

如果因爲物品對象是一樣的話,它不會進去。但其屬性可能會更新。

您可能需要更改if或引入一些其他方法,如-[ArticleCell update],它檢查是否有任何影響單元格外觀的屬性發生更改。

相關問題