2017-09-01 139 views
0

這是我的場景:UITableView - reloadData或reloadRowsAtIndexPaths:

我有一個標籤的單元格。當我第一次加載單元格時,模型可能沒有標籤所需的數據...因此,當我(通過委託調用)發現模型剛剛獲得了標籤數據或標籤數據已更改時,我可以重新加載特定的單元格。我需要重新加載單元格(而不是僅設置標籤的文本)的原因是,它的高度可能會根據標籤是否包含文本而發生變化。

下面是我在做我的委託電話是什麼:

- (void)modelLabelDataDidChangeForModel:(NSString *)modelId 
{ 
    NSIndexPath *indexPath = [self indexPathForModel:modelId]; // Local method to get index path. 
    MyCell *cell = (MyCell *) [self.table cellForRowAtIndexPath:indexPath]; 
    if (cell) { 
     [self.table beginUpdates]; 
     [cell updateMostImportantContent]; 
     [self.table reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.table endUpdates]; 
    } 
} 

我得到在endUpdates崩潰(*** Assertion failure in -[UITableView _endCellAnimationsWithContext:]),因爲它說的行數後,更新不匹配的數量更新之前的行(因爲我沒有在更新塊中顯式地添加/刪除任何行;我只是重新加載了1行)。

因此,這使得我認爲該模型可能同時進行了2次更改:標籤數據正在改變1個項目(因此我的委託調用),但隨後也將一個項目添加到模型中因此崩潰)。

所以這讓我覺得,我怎麼能告訴我是否需要撥打reloadData或我是否可以重新加載1單元格reloadRowsAtIndexPaths:@[indexPath]

我是否必須跟蹤模型本身,還是有什麼我可以做的表視圖來確定這一點,並避免崩潰?

我的目標是高效:當我需要時致電reloadData,但我可以時致電reloadRowsAtIndexPath:@[indexPath]

回答

0

從文檔:

當調用此方法在由beginUpdates和endUpdates方法定義的動畫塊,它的行爲類似於deleteRowsAtIndexPaths:withRowAnimation :.在任何更新之前,UITableView傳遞給方法的索引都在表視圖的狀態中指定。無論在動畫塊中插入,刪除和重新加載方法調用的順序如何,都會發生這種情況。

在我看來你並不需要或需要這種呼叫或方法。您正在更新單個索引。 如果你想要更新多個索引,你應該通過創建一個你想要更新的索引數組來安排它,然後在完成數據更新時使用beginUpdates/endUpdates系列。

+0

當我剛剛使用了beingUpdates/endUpdates時,我得到了崩潰...所以我嘗試了使用reloadRowsAtIndexPaths方法,但它沒有解決它。所以我試着把它們合併。沒有工作。 –

0

-endUpdates方法強制UITableView重新計算所有可見單元格的高度。它在此之前,它驗證當前顯示的數據的一致性,並調用它dataSource

- numberOfSectionsInTableView: 
- tableView:numberOfRowsInSection: 

方法。 當您不呼叫-reloadData時,UITableView依賴之前收集的數據(例如,節數,節中的行數)是相同的。

當它不一樣時,你會得到斷言和崩潰。

爲了與UITableView的狀態數據的一致性,必須刪除/插入單元格在哪裏對象都消失了或新出現的beginUpdates/endUpdates塊內索引路徑。

+0

我明白崩潰意味着什麼以及它發生的原因,但我想知道如何判斷是重新加載表還是重新加載單元格。即使沒有使用reloadRowsAtIndexPaths,也會發生崩潰,因爲模型與表格不同步。如何判斷模型是否與當前數據不同步? –

+0

保持tableView與模型同步的一種可能方法是使用NSFetchedResultsController。它將報告當前顯示在表格中的所有數據集的變化,並且您將能夠使用動畫插入/刪除行。 – DisableR

+0

沒問題,但是我的模型沒有核心數據實體的支持(現在我無法將其移動到核心數據,因爲很多原因,現在不值得深入研究)。 –