2011-11-07 37 views
1

我們有一個場景,在用戶選擇不同的UITableView中的某個項目時,我們重複使用相同的UITableView來顯示數據庫中的不同記錄集合一個splitviewcontroller,但都在同一視圖中)。如何刪除可在UITableView(MonoTouch)中重複使用的單元格

當用戶選擇不同的區域進行查看時,我們從數據庫中提取適當的記錄,用新的一組記錄更新Source並調用ReloadData。

問題是,UITableView中的某些單元格仍然存在,並且在列表之間切換時會被重用,從而導致各行無效或重疊數據。

我的問題是:是否有一種方法,我們可以告訴UITableView放棄所有現有的單元格,包括那些排隊等待重用?我希望ReloadData能夠執行這個任務,但事實並非如此。

更新與補充說明:

在我們的表中的每個單元由子視圖的可變數量的(我們正在試圖模仿一個網格控件)。當用戶在左側導航中選擇不同的列表時,不能保證新選擇的列表中的子視圖位置(列)將與先前列表中的子視圖位置(列)重疊。這就是爲什麼我們正在尋找一種方法來刪除排隊的單元格。

回答

1

由於這是其他人可能發現的情況他們自己,我會張貼我們使用的解決方案,但我仍然對更多的「原生」方式感興趣。

下面是我們如何解決這個問題:

當正在顯示的記錄被改變,我們與當前單元配置一個唯一的標識符更新的UITableView(即,數據列表當前查看的用戶)。

然後,我們創建了一個自定義版本的UITableViewCell,並在創建時在單元格中記錄唯一列表標識符。

當我們離開一個可重用的單元格時,我們將視圖的當前唯一標識符與存儲在單元格中的唯一標識符進行比較,如果它們不匹配,我們丟棄該單元格並創建一個新單元格。

希望這會幫助路上的人。

+0

你怎麼能丟棄細胞?它會導致內存泄漏,因爲你永遠不會使用該單元格,並且該單元格仍然存儲在UITableView的可重用緩存中。 – nonamelive

0

ReloadData不清除重用隊列。它只是觸發回調重新讀取重新加載行的數據。當每個單元格被加載時,如果你將它從重用隊列中取出,它仍然會被使用。這很好,即使表視圖被重用,因爲單元格類型是相同的類型,特別是因爲您使用CellIdentifier來確保。

但是,這是奇怪的,你是重疊的數據。當您將單元從重用隊列中取出時,您如何將數據放入其中?你是直接在單元上繪製數據嗎?你是否在數據中添加子視圖(導致多組重疊數據)?通常情況下,一個單元格包含文本標籤等子視圖,並在其上設置數據,因此沒有數據重疊的情況 - 單元格的子視圖只是更新了其數據...

+0

對不起,我忘了提及關於包含子視圖的單元格的部分。我用更多的信息更新了這個問題。 –

0

您的GetCell方法需要確保出列單元完全配置了要顯示的新數據。

一個常見的錯誤是假設只是出現顯示的單元格會給你一個可以使用的新單元。

如果您已經對單元格進行了任何自定義,比如添加視圖,修改其屬性(圖片,披露指標,背景顏色),您必須確保在GetCell方法中重用了單元格中的每一個屬性在返回單元格之前正確設置。

+0

謝謝,我完全理解GetCell背後的概念,並且需要在每次傳遞時正確配置單元。然而,由於沒有任何東西可以將一個單元與一個更高級別的概念(例如它所屬的列表)聯繫起來,我所尋找的是一種方法來刷新標記爲重用的單元的緩存,而不是必須採取我們最終實施的更長的路。 –

相關問題