2013-10-25 103 views
12

我有一個UITableview,它會加載所有不同大小的圖像。當一個圖像加載時,我需要更新特定的單元格,所以我想通過使用reloadRowsAtIndexPaths。但是,當我使用此方法時,它仍然爲每個單元格調用heightForRowAtIndexPath方法。我認爲reloadRowsAtIndexPaths的全部用途是它只會爲您指定的特定行調用heightForRowAtIndexPath?iOS UITableView reloadRowsAtIndexPaths

任何想法爲什麼?

[self.messageTableView beginUpdates]; 
[self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.messageTableView endUpdates]; 

謝謝

+0

你嘗試只使用.. [self.messageTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; –

+0

你的意思是不是將它包裝在beginUpdates和endUpdates中?是的,我嘗試過,它仍然試圖重做每個單元格的高度。真的很煩人,因爲我期待它爲這個特定的單元格調用heightForRowAtIndexPath。 – Jesse

+0

我是否相信它應該只爲這個單元調用heightForRowAtIndexPath?或者它是否再次爲表格中的每個單元格調用此方法? – Jesse

回答

7

endUpdates觸發內容大小重新計算,這需要heightForRowAtIndexPath。這就是它的工作原理。

如果出現問題,您可以將您的單元配置邏輯拉到cellForRowAtIndexPath以外,並直接重新配置單元,而不需要通過reloadRowsAtIndexPaths。這裏是爲了什麼,這可能看起來像一個基本輪廓:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellId = ...; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]; 
    } 
    [self tableView:tableView configureCell:cell atIndexPath:indexPath]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    //cell configuration logic here 
} 

然後,無論你目前正在打電話reloadRowsAtIndexPaths,你這樣做,而不是和heightForRowAtIndexPath不會被調用:

UITableViewCell *cell = [self.messageTableView cellForRowAtIndexPath:indexPath]; 
[self tableView:self.messageTableView configureCell:cell atIndexPath:indexPath]; 
+1

問題不是cellForRowAtIndexPath。這是事實,當我做任何類型的重新加載時,爲UITableView中的每個單元格調用heightForRowAtIndexPath。我停止使用beginUpdates和endUpdates,但這仍然發生 – Jesse

+0

@Jesse您可能錯過了我的觀點。如果將單元的配置邏輯從'cellForRowAtIndexPath'移出單獨的方法(您可以從'cellForRowAtIndexPath'調用,您可以通過直接調用方法來更新單元的配置,而不是使用'reloadRowsAtIndexPaths'(它間接調用'cellForRowAtIndexPath' ),因此繞過了重新計算內容大小(它間接調用'heightForRowAtIndexPath')的表視圖的重載行爲 –

+0

嗨蒂姆。我調用配置單元格方法,但我有自動佈局約束衝突,它說我的單元格高度是300,而我的圖片高度大於300.似乎調用配置單元格不會更新單元格的高度。是否有任何通知表視圖來更新高度?我試圖在再次調用configure單元之前手動調用heightForRow方法。 – Zhang