カスタム作成されたUITableViewCellを使用してリッチUITableViewを実装しているので、これらを1つの方法で画面に表示しますが、画面から消えたら、2回目に表示されるので、メモしたいと思います。別の方法で表示されます。画面から離れるときは、自動で「既読にする」と考えてください。
私は、セルが画面から消えたときを検出する方法を探していました(デロケーティング、デキュー、または同等のもの)。できれば:UITableViewControllerクラスで[indexPath行]を簡単にメモしますが、: UITableViewCellも同様に優れています。
私はこれを標準的な方法で行うことができませんでした...テーブルで複数のreloadData呼び出しを行うので、表示された回数を数えることは問題外のようです。
誰かアイデアはありますか?これは少しトリッキーなようです:)
これは古い質問ですが、誰かが探している場合に備えて、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...
}
}
UITableViewCell
が非表示になると、UITableView
から削除されます。メソッド-(void)removeFromSuperView
をオーバーライドして、メソッド内で何かを行うことができます。最後に、[super removeFromSuperView]
を呼び出すことを忘れないでください。
私はあなたが使うことができると思います
- (NSArray *)visibleCells
uITableViewのメソッド。これにより、表示されているすべてのセルの配列が返されます。次に、「表示されていない」(つまり、この配列にない)データを好きなようにマークして、スクロールして戻ったときに更新されるようにすることができます。
お役に立てば幸いです
AndreyTarantsovが言及しているUITableViewCellのprepareForReuse
メソッドは良さそうです。そこにいくつかのNSLogを配置すると、セルの任意の変数の値を出力できます。これをテーブルビューコントローラーに戻す方法について何か考えはありますか?
画面外に出るセルがまさにあなたが捕まえたいものであると確信していますか?アイテムを既読としてマークしたい場合、これは適切な方法ではないようです。たとえば、テーブルを非常に速くスクロールする可能性があります。すべてのものを既読としてマークすると、非常に驚きます。
技術的な部分については、画面に表示されているセルのリストを保持し(cellForRowAtIndexPathはそのリストにセルを追加する必要があります)、scrollViewDidScroll
デリゲートメソッドでセルが表示されなくなったかどうかを確認します。
別の考えられるアイデア:セルにprepareForReuse
メソッドがあることを覚えています。ただし、いつ呼び出されるかはわかりません。
UITableViewのindexPathsForVisibleRowsプロパティを定期的にチェックしてみようと思います。最大のインデックスパスから、前のすべての行が過去にスクロールされたと推測できます。