2009-05-08 25 views
25

カスタムUITableViewCellを使って豊富なUITableViewを実装していますが、これを画面に1つの方法で表示しますが、一度画面から消えると、彼らが二回目に来るとき、私は彼らが異なった方法で表示されることを望みます。画面を離れるときは、自動的に「マークを読み取り」と考えてください。UITableViewCellが画面外に出るのを検出しました

私は、セルが画面外に出てきたとき(getallocまたはdequeuedまたは同等のもの)、好ましくは:UITableViewControllerクラスで、[indexPath行]を簡単にメモするための方法を探していました。しかし:UITableViewCellも同様に良いです。

標準的な方法でこれを行うことはできませんでした...テーブルに複数のreloadData呼び出しを行うと、表示された時間を数えていないようです。

誰でもいいですね。これは少し難しいようです:)

答えて

-1

私は定期的にUITableViewのindexPathsForVisibleRowsプロパティをチェックしようとすると思います。最大の索引パスから、前のすべての行がスクロールされたことを推測できます。

+0

はい、これはオプションで、私はその呼び出しをcellForRowAtIndexPathに置くことができます。 しかし、私は可変な高さの行を持っているので、オフスクリーンセルがオフスクリーンとしてマークされるという保証はありません。 –

5

私はあなたのUITableViewのため

- (NSArray *)visibleCells 

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

1

に役立ちます希望は、あなたはオフスクリーンに行くの細胞はあなたがキャッチしたい正確に何ですか?項目を読んだものとしてマークしたい場合、これは適切な方法ではないようです。たとえば、テーブルをすばやくスクロールする可能性があります。すべての情報を既読にしておくと非常に驚くでしょう。技術的な部分については

、単に画面上にあるセルのリストを維持する(cellForRowAtIndexPathがそのリストにセルを追加する必要があります)、およびscrollViewDidScrollデリゲートメソッドチェックでそれらのいずれかは、もはや表示されている場合。

もう1つ考えられます:セルにprepareForReuseメソッドがあることを覚えています。しかし、それが呼び出されるときはわかりません。

1

Andrey Tarantsovが言及しているUITableViewCellのprepareForReuseメソッドがうまくいきます。いくつかのNSLogをそこに置くことで、セルの任意の変数の値を表示することができます。どのようにこれをテーブルビューコントローラに戻すことができるかについての考えはありますか?

+0

私はデリゲートを使ってこれを行うだけです –

6

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

+0

これは信頼できる解決策ではありません。私はiOS 6.0シミュレータでこれをテストしましたが、セルは削除される代わりに隠されたように見えます。奇妙なことに、 'setHidden:YES'も私の実装で呼び出されていません!明らかにtableViewの実装では、ivarはプロパティセッターメソッドをスキップして直接設定されます。 –

+0

サブクラス化した後にremoveFromSuperViewメソッドが呼び出されないUITableViewCell –

58

これは古い質問ですが、場合には、誰もが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... 
    } 
} 
+0

これは私が探している解決策ですが、iOS 5.0の場合です。助言がありますか? –

+0

残念ながらアップルからは何も提供されていません。私がしたのはscrollViewDidScrollを使って、visibleCells配列がscrollviewの前の "フレーム"から変更されたかどうかを調べるための簡単な計算でした。希望が助けてくれる! –

+0

ありがとう!ちょうど私が探していたもの! – Undo

関連する問題