2017-01-24 33 views
0

由XCode嚮導創建的主 - 明細項目包含tableView:cellForRowAtIndexPath:的實現,該實現調用dequeueReusableCellWithIdentifier:forIndexPath:,然後調用自定義方法configureCell以用有效數據填充單元格控件,然後將單元格返回給調用者。據我所知,這是如何表知道如何繪製其單元格內容。tableView:cellForRowAtIndexPath:應該如何使用?

我不明白的是如何使用它,當我想從我的代碼中獲取單元格。它甚至應該被我的代碼調用,還是它只是表框架本身使用的回調?例如,如果我只想更改單元格中一個標籤的文本,我認爲我可以調用tableView:cellForRowAtIndexPath:,並在生成的單元格對象控件中更改我需要的內容。但調用tableView:cellForRowAtIndexPath:實際上會生成一個新的單元對象(可能會重用未使用的單元對象池中的一個),並使用數據填充所有控件,如圖像瀏覽和標籤。當我想要更改一個標籤時,這對我的表現並不好。

因此,也許我可以從tableView:cellForRowAtIndexPath:中刪除configureCell?但是,如果調用[table reloadData]時如何確保所有單元格內容將被系統重新繪製?

P.S. 的XCode 7嚮導創建這種代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    [self configureCell:cell withObject:object]; 
    return cell; 
} 

// Then later in controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 

    case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] withObject:anObject]; 
     break; 

configureCell被稱爲這裏的兩倍。對我來說似乎是無意義的。我希望至少有人爲代碼編寫巫師知道這應該如何工作。

+0

此調用僅由表框架使用。你可以調用reloadRowsAtIndexPaths並只發送一行來更新一個特定的行。 –

回答

1

這裏有兩種不同的方法在這裏被稱爲具有相似的名稱。

tableView:cellForRowAtIndexPath:是一個UITableViewDataSource方法,您可以通過它來創建要顯示的表格的單元格。當一個新的單元出現在屏幕上時,tableview調用這個方法。

controller:didChange:...正在調用不同的方法,稱爲cellForRowAtIndexPath:這是一個UITableView方法。此方法將查詢表格,以查找之前使用tableView:cellForRowAtIndexPath:數據源方法創建之後已顯示的單元格,並且不會再次調用它。它調用此方法訪問已顯示的單元格,並在對象更改時用新信息更新它。

兩個電話configureCell是必要的。

+0

我的不好,方法名稱太相似了,我沒有看到他們實際上不同。現在它是有道理的。謝謝。 – jesse

+0

但是爲什麼這兩個調用configureCell都是必要的?第二個人是不是會覆蓋第一個人所做的一切? – jesse

+0

第二個僅在對象發生更改時調用,因此您希望使用更新對象中的數據覆蓋單元中當前的數據。 – dan

相關問題