2012-12-07 55 views
5

一旦細胞不再在屏幕上可見,我需要收到通知。iOS - 檢測UITableViewCell被移出可見視圖嗎?

UITableView已經有一個叫做tableView:didEndDisplayingCell:forRowAtIndexPath:的委託方法,但是這個委託方法永遠不會被調用。是的,我有我的UITableView集委託。

任何其他方式來檢測被刪除的單元格?我需要能夠保存該單元格的內容(輸入),然後才能被其他項目重用。

編輯:

根據文檔tableView:didEndDisplayingCell:forRowAtIndexPath:是iOS 6或更高API。有沒有辦法在iOS 5上實現這一點?

+0

已添加到'self'了'UITableViewDelegate'並設置表視圖的委託? –

+0

是的,我特別提到在我的問題:) – aryaxt

+0

你測試的是哪個版本的iOS? –

回答

8

在6.0以上版本的iOS上,表格視圖不會發送tableView:didEndDisplayingCell:forRowAtIndexPath:消息。

如果您正在使用的UITableViewCell一個子類,你可以通過重寫didMoveToWindow獲得舊版iOS一樣的效果:

- (void)didMoveToWindow { 
    if (self.window == nil) { 
     // I have been removed from the table view. 
    } 
} 

您可能需要給你的細胞(弱或unsafe_unretained)參考回到您的表格視圖委託,以便您可以向委託人發送消息。

但是,您不能只依賴於didMoveToWindow所有版本的iOS。在iOS 6之前,表格視圖總是將表格視圖單元格作爲子視圖去除,然後重用它,因此單元格在重用之前總是會收到didMoveToWindow。但是,從iOS 6開始,表格視圖可以重用單元格而不需要將其作爲子視圖刪除。表視圖將簡單地改變單元格的框架,將其移動到新的位置。這意味着從iOS 6開始,單元格而不是在重用之前總是會收到didMoveToWindow

所以你應該在你的代理中實現didMoveToWindowtableView:didEndDisplayingCell:forRowAtIndexPath:,並且確保它在兩個被調用的情況下工作,或者只調用一個。

+0

在看到這個之前發佈我的回答,因此可能會接受這個答案,因爲它非常接近我的問題並解決問題 – aryaxt

1
tableView:didEndDisplayingCell:forRowAtIndexPath: 

僅適用於iOS6及更高版本。

一個(儘管緩慢)的方式來完成你將要使用的scrollView委託方法來監視tableview滾動。從那裏,請撥打:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows]; 

並檢查對可見路徑數組的任何更改。

4

我最終使用下面的組合來確保邏輯適用於iOS 5.0和6。0

元邏輯

@protocol MyCellDelegate 
- (void)myCellDidEndDisplaying:(MyCell *)cell; 
@end 

@implementation MyCell 

// Does not work on iOS 6.0 
- (void)removeFromSuperview 
{ 
    [super removeFromSuperview]; 

    [self.delegate myCellDidEndDisplaying:(MyCell *)self]; 
} 

@end 

視圖 - 控制邏輯

@implementation MyViewcontroller 

- (void)myCellDidEndDisplaying:(MyCell *)cell 
{ 
    IndexPath *indexPath = [self.tableView indexPatForCell:cell]; 
    // do stuff 
} 

// Does not work on iOS below 6.0 
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

} 

@end