5

セルが画面に表示されなくなったらすぐに、通知を受ける必要があります。

UITableView には既にデリゲート メソッドが呼び出されていますtableView:didEndDisplayingCell:forRowAtIndexPath:が、このデリゲート メソッドは呼び出されません。はい、UITableView セットのデリゲートがあります。

削除されたセルを検出する他の方法はありますか? 別の項目で再利用される前に、このセルの内容 (入力) を保存できる必要があります。

編集:

ドキュメントによると、tableView:didEndDisplayingCell:forRowAtIndexPath:iOS 6 以降の API です。iOS 5 でこれを実現する方法はありますか?

4

3 に答える 3

8

tableView:didEndDisplayingCell:forRowAtIndexPath:6.0 より古いバージョンの iOS では、テーブル ビューはメッセージを送信しません。

のサブクラスを使用している場合はUITableViewCell、古いバージョンの iOS で をオーバーライドして同じ効果を得ることができますdidMoveToWindow

- (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

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

于 2012-12-07T21:35:26.853 に答える
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
于 2012-12-07T21:37:15.730 に答える
1
tableView:didEndDisplayingCell:forRowAtIndexPath:

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

目的を達成するための(遅いとはいえ)1つの方法は、scrollViewデリゲートメソッドを使用して、テーブルビューがスクロールするタイミングを監視することです。そこから、電話してください:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows];

表示されているパスの配列に変更がないか確認します。

于 2012-12-07T21:17:31.210 に答える