web-dev-qa-db-ja.com

UITableViewCellが画面から消えたときに検出する

カスタム作成されたUITableViewCellを使用してリッチUITableViewを実装しているので、これらを1つの方法で画面に表示しますが、画面から消えたら、2回目に表示されるので、メモしたいと思います。別の方法で表示されます。画面から離れるときは、自動で「既読にする」と考えてください。

私は、セルが画面から消えたときを検出する方法を探していました(デロケーティング、デキュー、または同等のもの)。できれば:UITableViewControllerクラスで[indexPath行]を簡単にメモしますが、: UITableViewCellも同様に優れています。

私はこれを標準的な方法で行うことができませんでした...テーブルで複数のreloadData呼び出しを行うので、表示された回数を数えることは問題外のようです。

誰かアイデアはありますか?これは少しトリッキーなようです:)

27
Kaspa

これは古い質問ですが、誰かが探している場合に備えて、iOS6では、これを行う新しいUITableViewDelegate関数が導入されました。

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

セルが削除されるたびに通知するのに最適ですが、非常に徹底的であるため、セルをリロードすると、置き換えられる古いセルでもこの​​デリゲート関数がトリガーされます。私の実装では、渡されたindexPathがまだ配列tableView.indexPathsForVisibleRows内にあるかどうかを確認するだけです。何かのようなもの:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([tableView.indexPathsForVisibleRows indexOfObject:indexPath] == NSNotFound)
    {
        // This indeed is an indexPath no longer visible
        // Do something to this non-visible cell...
    }
}
67
Mr. T

UITableViewCellが非表示になると、UITableViewから削除されます。メソッド-(void)removeFromSuperViewをオーバーライドして、メソッド内で何かを行うことができます。最後に、[super removeFromSuperView]を呼び出すことを忘れないでください。

6
Feng Stone

私はあなたが使うことができると思います

- (NSArray *)visibleCells

uITableViewのメソッド。これにより、表示されているすべてのセルの配列が返されます。次に、「表示されていない」(つまり、この配列にない)データを好きなようにマークして、スクロールして戻ったときに更新されるようにすることができます。

お役に立てば幸いです

6
h4xxr

AndreyTarantsovが言及しているUITableViewCellのprepareForReuseメソッドは良さそうです。そこにいくつかのNSLogを配置すると、セルの任意の変数の値を出力できます。これをテーブルビューコントローラーに戻す方法について何か考えはありますか?

2
Adam Swinden

画面外に出るセルがまさにあなたが捕まえたいものであると確信していますか?アイテムを既読としてマークしたい場合、これは適切な方法ではないようです。たとえば、テーブルを非常に速くスクロールする可能性があります。すべてのものを既読としてマークすると、非常に驚​​きます。

技術的な部分については、画面に表示されているセルのリストを保持し(cellForRowAtIndexPathはそのリストにセルを追加する必要があります)、scrollViewDidScrollデリゲートメソッドでセルが表示されなくなったかどうかを確認します。

別の考えられるアイデア:セルにprepareForReuseメソッドがあることを覚えています。ただし、いつ呼び出されるかはわかりません。

1

UITableViewのindexPathsForVisibleRowsプロパティを定期的にチェックしてみようと思います。最大のインデックスパスから、前のすべての行が過去にスクロールされたと推測できます。

0
Chris Lundie