2012-12-07 9 views
5

セルが画面に表示されなくなったらすぐに通知する必要があります。iOS - UITableViewCellが可視ビューから移動されていることを検出していますか?

UITableViewには既にtableView:didEndDisplayingCell:forRowAtIndexPath:というデリゲートメソッドがありますが、このデリゲートメソッドは呼び出されません。そして、はい、私は私のUITableViewセットの代理人を持っています。

削除するセルを検出する他の方法はありますか?このセルのコンテンツ(入力)を別のアイテムで再利用する前に保存する必要があります。

EDIT:

ドキュメント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)の参照を与える必要があるかもしれませんデリゲートにメッセージを送信できるように、テーブルビューのデリゲートに渡します。

ただし、iOSのすべてのバージョンでdidMoveToWindowにのみ依存することはできません。 iOS 6以前では、テーブルビューは常にテーブルビューのセルをサブビューとして削除してから再利用していたため、再利用する前に常にdidMoveToWindowが返されていました。ただし、iOS 6以降、テーブルビューではのサブビューとして削除せずに再利用できます。テーブルビューはセルのフレームを変更して新しい位置に移動します。これは、iOS 6以降では、ではなく、はいつも再利用される前にdidMoveToWindowを受け取ることを意味します。

セルのサブクラスにdidMoveToWindowを実装し、デリゲートにtableView:didEndDisplayingCell:forRowAtIndexPath:を実装し、両方が呼び出された場合、または1つだけ呼び出された場合に動作することを確認してください。

+0

これを見る前に私の答えを投稿しました。それは本当に私に近いところにあり、問題を解決しているので、おそらくこれを答えとして受け入れます – aryaxt

1
tableView:didEndDisplayingCell:forRowAtIndexPath: 

は、iOS6以降でのみ使用できます。

スクロールビューのデリゲートメソッドを使用して、テーブルビューがスクロールしたときを監視することができます。そこから、

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 

のViewControllerロジック

@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 
関連する問題