2011-10-28 144 views
0

在我的tableview中,我將子視圖添加到某個單元格中。如果單元格的數量大於一個屏幕的高度,例如,屏幕可以包含10個單元格,如果滾動到11個單元格,則第一個單元格將消失。當返回頂部時,即使沒有單元格,第一個單元格也會顯示子視圖。contentView子視圖保持在屏幕上

是因爲子視圖浮動嗎?

回答

0

這是因爲單元格正在被重用,以節省內存。當您滾動您的表格視圖時,它將重新使用相同的單元格,這些單元格會被推出屏幕。如果其中一些包含子視圖,則子視圖也可能被重用並顯示在錯誤的地方。

如果要添加子視圖細胞的contentView,一定要標記(UIViewtag屬性)的意見,並與[cell.contentView viewWithTag:YOUR_TAG_ID]接他們,做任何你想和他們(即刪除子視圖如果它不應該是在你的新單元格中)。

例(其中UITextField在一些細胞中添加):

// try to get the text field from the cell 
textField = (UITextField*)[cell.contentView viewWithTag:kTABLE_CELL_TAG_TEXTFIELD]; 

if (textField) { 
    // remove it if it already exists 
    [textField removeFromSuperview]; 
} 
+0

謝謝,我試圖在viewWillAppear刪除它。但是滾動操作不會調用viewWillAppear。在滾動事件方法中清理並重繪子視圖看起來不太好。 – atu0830

+1

最好的方法是在返回重用單元格之前,將它在tableView:cellForRowAtIndexPath中刪除。 如果您在滾動時遇到滯後(即如果子視圖很重或者您有多個子視圖),則可以更好地在子類UITableViewCell'-drawRect中繪製內容:而不是。看看這個問題的一些更多的信息如何做到這一點:http://stackoverflow.com/questions/1106658/custom-draw-a-uitableviewcell –

+0

無論如何,再次感謝。它看起來系統只緩存具有相同reuseIdentifier的單元。我的代碼只包含有限的單元格,所以刪除或重繪仍然看起來很複雜。 – atu0830

0

要避免這種行爲,你可以刪除你的所有意見,增加新的子視圖之前。

for (UIView *view in cell.contentView.subviews) 
{ 
    [view removeFromSuperview]; 
} 
+0

是的,這也會起作用,但不會像標記視圖一樣提供對內容的控制。猜猜這是一個控制怪物你是多少... :) –

-1

通過爲每個單元設置唯一的reuseIdentifier來修復,以便tableview不能重用單元。我的表格視圖應該在100行,所以看起來不錯。

+0

即使這可能適用於你的情況,我真的建議反對它。這會導致應用程序消耗比實際需要更多的內存,這可能會導致其他地方出現意想不到的問題。它擊敗了「UITableView」緩存的目的。 如果你的單元格非常不同(在佈局等方面),使用不同的單元格標識符是可以的。但我看不到你需要100個獨特的小區標識符。如果你這樣做,你應該重新考慮你的設計... –

+0

其實這張表是一個自定義的NSUserdefaults,有些項目使用相同的視圖結構。對於那些項目,我使用一個reuseIdentifier。其他項目是固定的,所以我可以使用另一個reuseIdentifier。我知道你的想法很好,但我的要求足以使用上述解決方案。抱歉上面的解決方案看起來不太清楚.. – atu0830