我正面臨一些奇怪的問題。每當我滾動我的表格視圖時,我的數據被替換爲其他單元格。每一次,它都會被不同的單元格數據取代。我沒有看到這個替代品有任何特定的模式。滾動時顯示的單元格數據不正確UITableView
回答
下面是如何正確地重用單元代碼:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
cell.textLabel.text = [array objectAtIndex:indexPath.row];
return cell;
}
如果您提供的代碼,我們可以修改,而不是給你普通的例子。
嗨,謝謝你的答覆。但是如果我在單元格分配行之後完成了if(cell == nil)的括號,我的日期會相互重疊。 – user714236 2011-05-10 18:16:10
@user如果你的日期相互重疊,那是因爲你沒有正確處理日期。這是處理可重用細胞的正確方法。如果你認真尋求幫助,你應該發佈一些代碼。我的猜測是,您要麼每次添加新的子視圖,要麼手動繪製它們,您在繪製日期之前未清除表面。 – 2011-05-10 21:41:23
這不僅是單元重用的問題。在iOS 6.0中,有一個很好的方法來解決這個問題:http://stavash.wordpress.com/2012/12/14/advanced-issues-asynchronous-uitableviewcell-content-loading-done-right/ – Stavash 2012-12-14 16:07:12
如果您創建了自定義單元格,則可能必須在UITableViewCell
子類上實施prepareForReuse
以清除單元格數據。
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
Thanks Rams.I得到了解決方案。我沒有給複用標識符,它對我來說非常完美。 – user714236 2011-05-17 14:37:54
yes this reuseIdentifier:nil也幫助我.. – 2012-09-27 10:29:01
非常感謝你的工作。我的細胞每次都在變化。 – 2013-12-22 13:49:46
舊的,但仍然... 我遇到了這個問題。如果其他人有一天看到這個問題。 我沒有注意到,也不記得我爲什麼這麼做,但是我寫了測試if (cell == nil)
裏面的單元格的配置,而不是在寫完之後寫入它。我一定累了這一天...
我在iOS 7和故事板上有同樣的問題,而我從來沒有在老年人Xcode-SDK版本上使用相同的代碼的這個問題,並嘗試從stackoverflow很多建議,我無法修復它,並猜測是什麼?!蘋果的TableView Programming Guide有很好的解釋指南。 甚至不需要使用cell==nil
。
所以要創建一個使用故事板的自定義tableview單元格,可以正確重用,可以採取兩種不同的方法。我個人更喜歡第一個更直接的,但我把這兩個解決方案放在這裏。
第一種方法
- 創建一個使用主從應用模板的項目,並選擇使用故事板選項。
- 在故事板畫布上,選擇主視圖控制器。
- 在Identity檢查器中,驗證Class是否設置爲自定義MasterViewController類。
- 選擇主視圖控制器內部的表格視圖。
- 在屬性檢查器中,驗證內容彈出式菜單是否設置爲動態原型。
- 選擇原型單元格。
- 在屬性檢查器中,在樣式彈出菜單中選擇自定義。
- 在標識符文本字段中輸入重用標識符。 這是與發送到
dequeueReusableCellWithIdentifier:
消息中的表視圖相同的重用標識符。 - 在Accessory彈出菜單中選擇Disclosure Indicator。
- 將庫中的對象拖動到單元格上。 對於此示例,拖動兩個標籤對象並將它們放在靠近單元格末端的位置(爲附件視圖留出空間)。
- 選擇對象並設置其屬性,大小和自動修改特徵。
爲此過程的編程部分設置的一個重要屬性是每個對象的tag
屬性。在Attributes inspector
的View
部分中查找此屬性,併爲每個對象分配一個唯一的整數。
現在編寫您通常會寫入的代碼以獲取表視圖的數據。 (在本例中,您需要的唯一數據是每個單元格的行號。)實現數據源方法tableView:cellForRowAtIndexPath:從原型創建一個新單元格,並使用數據填充它,其方式與此代碼類似:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"%d", indexPath.row];
label = (UILabel *)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
return cell;
}
有此代碼的幾個方面需要注意:
- 分配給原型電池的串標識符是你傳遞給在
dequeueReusableCellWithIdentifier:
表視圖相同的字符串。 - 因爲原型單元格是在故事板中定義的,所以
dequeueReusableCellWithIdentifier:
方法總是返回一個有效的單元格。您無需檢查返回值nil並手動創建單元格。 - 代碼通過調用
viewWithTag:
傳入其標籤整數來獲取單元中的標籤。然後它可以設置標籤的文本內容。
第二種方法
如果你不喜歡使用標籤,您可以使用另一種方法設置單元格中的內容。爲要設置的對象定義一個帶有插座屬性的自定義UITableViewCell
子類。在故事板中,將新類與原型單元相關聯,並將出口連接到單元中的相應對象。
要使用網點的自定義單元格內容
- 名爲MyTableViewCell的Objective-C類添加到您的項目。
下面的代碼添加到所述接口中
MyTableViewCell.h
:@interface MyTableViewCell:的UITableViewCell
@屬性(非原子,弱)IBOutlet中的UILabel * firstLabel; @property(非原子,弱)IBOutlet UILabel * secondLabel; @end
下面的代碼添加到實施
MyTableViewCell.m
:@synthesize firstLabel,secondLabel;
下面的代碼行添加到實現該數據源的源文件:
#進口「MyTableViewCell。H」
使用
Identity inspector
原型細胞的類設置爲MyTableViewCell
。使用連接檢查員在原型細胞中的兩個出口連接到其相應的標籤。
執行數據源方法
tableView:cellForRowAtIndexPath:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row]; return cell; }
代碼使用訪問器方法獲取對單元中標籤的訪問權限(此處使用點標記)。代碼然後可以設置標籤的文本內容。
- 1. Xamarin CollectionView突出顯示不正確的單元格當滾動
- 2. UITableView不顯示單元格。
- 3. 滾動時錯誤的單元格數據UITableView
- 4. UITableView添加新單元格時滾動
- 5. 滾動時UITableView單元格變空白
- 6. 重複單元格,同時滾動uitableview
- 7. UITableView滾動到最後一個單元格只顯示單元格的一半
- 8. iOS UITableView只滾動時重新加載單元格數據
- 9. UITableView選中的單元格在啓動時不顯示文本
- 10. UITableView - 僅在滾動停止後顯示完整單元格
- 11. UITableView與兩個自定義單元格沒有正確顯示
- 12. UITableView不顯示單元格樣式2
- 13. UITableView單元格:selectedBackgroundView而不顯示backgroundView
- 14. UITableView不能及時滾動查看插入單元格動畫
- 15. UITableView的自定義單元格滾動
- 16. UITableView滾動非常大的單元格
- 17. 滾動時UIDatePicker的滾輪顯示不正確
- 18. UITableView單元有時無法更新圖像,但滾動後顯示正常
- 19. 不正確的滾動數據UITableView和UICollectionView
- 20. tvOS UITableView滾動到單元格
- 21. 設置滾動最後UItableview單元格
- 22. 在UITableView中滾動定製單元格
- 23. 單元格圖像更改滾動UITableView
- 24. UITableview單元格不顯示,直到您滾動。也有在主隊列
- 25. 正確地從UITAbleView釋放單元格
- 26. TextView裏面的表格單元格顯示不正確
- 27. UITableview顯示有限的單元格
- 28. 如何從NSDictionary顯示UITableView單元格中的數據?
- 29. DataGridView不顯示單元格數據
- 30. UITableView具有單元格,但不顯示單元
您並未重複使用/正確創建單元格。發佈您的cellForRowAtIndexPath方法,我們將能夠指出錯誤 – Vladimir 2011-05-10 15:07:35
需要查看'tableView:cellForRowAtIndexPath:'的代碼。 – PeyloW 2011-05-10 15:10:10