2012-05-28 66 views
1

隨着用戶在uitableview中上下滾動,細胞被破壞和創建。當uitableviewcell被破壞時的iOS回調

有沒有辦法來檢測細胞何時會被銷燬?

+0

也許你應該把你的問題放在你真正想做的事情的背景中。我回答的問題是,當他們滾動時,不能保證細胞被破壞;他們通常被緩存以供重新使用。 –

+0

http://stackoverflow.com/questions/3330735/detect-when-uitableviewcell-goes-out-of-scope – Lee

回答

11

假設通過「破壞」你實際上是指一個單元格被重用,只需在你的UITableViewCell派生類中實現prepareForReuse

prepareForReuse

準備由表視圖的代表用於再使用可重複使用的小區。

- (void)prepareForReuse 

討論

如果一個UITableViewCell對象是可重複使用的,也就是說,它具有回用 標識符 - 該方法是剛剛從UITableView的方法dequeueReusableCellWithIdentifier返回 對象之前調用的: 。對於 性能原因,您應該只重置 與內容無關的單元格的屬性,例如alpha,編輯和選擇 狀態。 tableView:cellForRowAtIndexPath: 中的表視圖委託應該在重用單元時始終重置所有內容。如果單元格 對象沒有關聯的重用標識符,則此方法爲 未調用。如果您重寫此方法,則必須確保調用超類實現。

可用性 適用於iOS 2.0及更高版本。 另請參見 - initWithFrame:方法reuseIdentifier: @property reuseIdentifier 宣佈 UITableViewCell.h

+0

正確。這個影響很重要。 'prepareForReuse'消息在單元出池時發送,而不是在完成顯示時發送。這意味着它不能依賴於釋放單元實現保留的重量級資源。 –

0

您可以繼承UITableViewCell並覆蓋它的dealloc方法。

假設您正在重新使用單元格來保存資源,這樣做的好理由是什麼?

0

什麼你試圖攔截是內部實現的UITableView的一部分以及如何管理其細胞。雖然有些方法可以嘗試攔截此類行爲,但我建議您避免使用它們,因爲不能保證將來的UITableView實現將保持此行爲。

在這種情況下,考慮採用不同的方法會更好:設計並實現自己的表類或更改代碼邏輯。

0

如上所述,當離開屏幕時單元不會被破壞。不過,您可以執行一些操作,以跟蹤相關操作,具體取決於您嘗試執行的操作。

首先出現的是一個委託消息:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

這一個小區進入屏幕之前被調用。另一種可能性是已經提到的單元格的prepareForReuse方法。

另一種方法是:嘗試並覆蓋willMoveToSuperview:或任何其他相關方法。我不確定在單元變得不可見之後這是否被觸發,但它可能起作用。

最好的問候, 邁克爾

4

沒有進入適用性或性能的影響,另一個選擇可能是定期檢查哪些細胞保持可見,使用的UITableView類的visibleCells方法:

- (NSArray *)visibleCells 

根據文檔:

返回包含UITableViewCell對象的數組,每個對象表示一個可見的ce在接收表視圖中。