2011-10-28 5 views
0

私のテーブルビューでは、いくつかのセルにサブビューを追加します。 1つの画面の高さよりも大きいセルの数、たとえば、画面に10個のセルが含まれている場合、11個のセルにスクロールすると、最初のセルは消えます。一番上に戻ると、セルがない場合でも、最初のセルが表示されますが、サブビューが表示されます。contentViewサブビューを続ける画面

サブビューが浮かんでいるのですか?

答えて

0

メモリを節約するために、セルが再利用されているためです。あなたのテーブルビューをスクロールすると、スクリーンから押し出される同じセルが再利用されます。それらのうちのいくつかにサブビューが含まれている場合、サブビューは間違った場所に再利用されて表示されることがあります。

あなたはセルのcontentViewにサブビューを追加する場合は、(UIViewtagプロパティ)をタグ付けするようにしてくださいビューと[cell.contentView viewWithTag:YOUR_TAG_ID]でそれらを取得し、あなたも一緒にやりたいことをすることになっていない場合(つまり、サブビューを削除あなたの新しいセルで)。

UITextFieldは、一部のセルに追加されます)例:行動のこの種のを避けるために

// try to get the text field from the cell 
textField = (UITextField*)[cell.contentView viewWithTag:kTABLE_CELL_TAG_TEXTFIELD]; 

if (textField) { 
    // remove it if it already exists 
    [textField removeFromSuperview]; 
} 
+0

ありがとうございます。私はviewWillAppearで削除しようとしています。しかし、スクロールアクションはviewWillAppearを呼び出さない。そして、スクロールイベントメソッドでサブビューをきれいにして再描画するのは良くありません。 – atu0830

+1

最も良い方法は、再利用されたセルを返す前に、tableView:cellForRowAtIndexPathでそれを削除することです。 スクロール時に時間がかかる場合(サブビューが非常に重い場合や複数のサブビューがある場合)、代わりにサブクラス化されたUITableViewCell '-drawRect:で描画する方がよい場合があります。この質問を見て、それを行う方法に関するいくつかの詳細情報があります:http://stackoverflow.com/questions/1106658/custom-draw-a-uitableviewcell –

+0

とにかく、ありがとうございました。システムは、同じreuseIdentifierを持つセルのみをキャッシュします。私のコードは限られたセルしか含んでいないので、削除や再描画は複雑に見えます。 – atu0830

0

、新しいサブビューを追加する前に、あなたのセルのすべてのビューを削除することができます。

for (UIView *view in cell.contentView.subviews) 
{ 
    [view removeFromSuperview]; 
} 
+0

はい、これも機能しますが、ビューにタグを付けるほどコンテンツを制御しません。あなたがどれほどコントロールフリークであるかの問題だと思う... :) –

-1

テーブルビューがセルを再利用できないように、すべてのセルに固有のreuseIdentifierを設定することで修正されました。私のテーブルビューは100行にする必要がありますので、よく見えます。

+0

これはあなたのケースではうまくいくかもしれませんが、私は本当にそれに反対してアドバイスします。それは、アプリケーションが実際に必要とするよりも多くのメモリを消費し、予期しない問題を他の場所で引き起こす可能性があります。それは 'UITableView'キャッシュの目的を破ります。 セルが非常に異なっている(レイアウトなどの点で)場合は、別のセルIDを使用しても問題ありません。しかし、100個のユニークなセル識別子がどのように必要なのか分かりません。もしあなたがそうしたら、おそらくあなたのデザインを再考する必要があります... –

+0

実際には、このテーブルはカスタマイズされたNSUserdefaultsであり、いくつかのアイテムは同じビュー構造体を使用します。それらのアイテムについては、私は1つのreuseIdentifierを使用します。 else項目は固定されているので、別のreuseIdentifierを使用することができます。私はあなたのアイデアが良いことを知っているが、私の要件は、上記のソリューションを使用するのに十分です。上記の解決策を申し訳ありませんが明らかではない.. – atu0830

関連する問題