2012-01-21 29 views
5

。我發現如果有新的單元被添加或帶走,它只會調用cellForRowAtIndexPath。力的UITableView調用的cellForRowAtIndexPath:對我有一些麻煩的UITableView的<code>reloadData</code>方法的所有單元格

例如:我有五個單元格,每個單元格包含五個字符串。如果我添加一個新單元格並呼叫reloadData,表格會更新,我會看到它。然而,如果我進入五個單元格之一,添加一個新的字符串,然後返回並調用reloadData,表視圖的委託方法都不會被調用。

我的問題:是否有可能強制表視圖完全重新加載其所有可見單元格中的數據?

回答

8

我發現了這個問題 - 我在if(cell == nil)塊中有我的單元格自定義代碼,因爲這些單元格正在被回收,所以它們沒有被更改。將我的自定義代碼從該塊中取出可解決問題。

+0

你節省了我的時間。謝謝!我不會猜到這個愚蠢的錯誤:) – Pruthvid

+0

很高興我的解決方案可以幫助別人! –

0

那麼,表格視圖只會在可見單元格上調用cellForRowAtIndexPath,但如果您確實調用了reloadData,它會這樣做,所以還有其他的事情發生,我不確定它是什麼。

+0

在這種情況下,所有的單元格都是可見的。我知道數據源(在這個例子中,NSUserDefaults)正在更新,所以我不確定爲什麼只有新的單元格正在更新。 –

+0

你是否將調用追蹤到'cellForRowAtIndexPath'來證明它沒有被調用,或者你只是沒有看到視覺變化?如果'cellForRowAtIndexPath'沒有被調用......我不知道發生了什麼。在那一點上,我會退後一步,追蹤調用'numberOfRowsInSection'。在任何情況下,我可以說''cellForRowAtIndexPath' _應該在您執行'reloadData'時調用每個可見單元格。 – smparkes

+0

NSLogs說,當我添加一個新行時,一切都會更新;我最初的假設是錯誤的。當從另一個視圖控制器返回表視圖時調用reloadData時,不會調用任何內容。 –

0

即使你的tableview有50行,也只有將存在儘可能多的細胞可以在同一時間可見。這是reuseIdentifier背後的全部內容。所以強迫'所有細胞'不存在。如果出現新的單元格,則會動態加載數據。

更改單元格的唯一方法是更改​​由dataSource方法cellForRowAtIndexPath傳遞的數據。

+1

我在我的問題中錯過了;我現在更新了它。 –

+0

如果你嘗試'reloadRowsAtIndexPaths:withRowAnimation:'只是爲了檢查...不要讓這是解決方案。 – Jodocus

+0

這也行不通;它沒有效果。 –

0

不要把你的代碼了if (cell == nil)塊。相反,請爲您正在製作的單元格創建一個代表性標識符;請嘗試確保標識符中引用了所有單元格的內容。例如,如果您顯示3個數字,請確保以唯一的方式在標識符中包含這三個數字,這隻會引用具有此類內容的單元格。

比方說,在你的類中有三個NSArray屬性,它們的int值都包含在NSNumber對象中。你想用這些NSArrays填補了UITableView的,這是我會怎麼做:

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@", 
          [[array1 objectAtIndex:indexPath.row] intValue], 
          [[array2 objectAtIndex:indexPath.row] intValue], 
          [[array3 objectAtIndex:indexPath.row] intValue]]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:identifier] autorelease]; 

     //Build your cell here. 
    } 

    return cell; 
} 
1

我發現,重裝部分更容易地重新加載數據。如果你只是有一個部分,你可以嘗試:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

1

你可以試試這個

[tableView reloadData]; 

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; 

把這個commitEditingStyle方法。

相關問題