1

UITableViewのカスタムセルに関する簡単な「ベストプラクティス」の質問があります。私の問題は、if(cell == nil)ブロックにカスタムセルを作成したときに発生します。

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

(1)ラベルを作成し、それらのtextプロパティを(cell == nil)ブロック内に設定した場合。画面に表示されているセルにのみ正しいテキストが含まれ、残りは再利用されます。

(2)わかりました。では、カスタムセルの建物をブロックの外に移動してみます。もちろん、これにより、ユーザーがスクロールするたびに、セルが何度も何度も再描画されます。

(3)カスタムセル(ラベル、グラフィックなど)の描画も(cell == nil)ブロック内に配置しようとしましたが、ブロックの後にlabels.textプロパティを設定しました。UILabelは、インスタンス化されたブロックの外側からアクセスできないため、これを行うことはできません。クレイジーなfor(UILabel * l in cell.contentView.subviews)を実行できますが、それぞれにifステートメントが必要になります。ラベルと、おそらくそれらを識別するためのいくつかのタグ。

(4)次に、(cell == nil)ブロックの前にすべてのラベルを宣言し、ブロック内でインスタンス化と描画を行い、(cell == nil)ブロックの後にtextプロパティを設定することができます。しかし、10個のUIラベルを渡すと、これは見た目も感じも非常に乱雑になり、(cell == nil)ブロックの内側と外側にこのように広がり、さらにテーブルを「更新」するたびに宣言されます。

私が尋ねる理由は、2〜4個のラベルを使用する場合、常にそれを回避する方法を見つけたためですが、今回は12個のカスタムUILabelを設定する必要があり、グラフィックの再描画を最小限に抑えるために設定したいと思います。おそらくたくさんの細胞があるでしょうから。

私は人々とAppleドキュメントが以下を使用する例を見てきました:

- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

しかし、それがどのように私を助けるのか本当にわかりません:)

誰かがこれらの種類のものの「ベストプラクティス」を指摘できることを願っています。

ありがとうございました!

4

1 に答える 1

3

あなたのオプション3は行く方法です。新しいセルが必要なときはいつでも(つまり、if (cell == nil)ブロック内に)すべてのサブビューを含むセルを作成し、ブロックの後にラベルの内容を設定します。

カスタムUITableViewCellサブクラスを使用する場合は、各ラベルのプロパティを宣言してcell.myLabelXから、ブロックの外側でそれらにアクセスできます。そうでない場合は、tagプロパティを使用して接続します。セルの作成時に、各ラベルに一意のタグを割り当てます。

UILabel *label1 = [[UILabel alloc] initWithFrame:...];
label1.tag = MYLABEL1TAG;
[cell addSubview:label1];
...

ブロックの外側で、タグを介してラベルを取得します。

UILabel *label1 = (UILabel *)[cell viewWithTag:MYLABEL1TAG];
label.text = ...

これは、Appleがサンプルコードの多くの場所でそれを行っている方法でもあります(少なくとも、私が最後に見たときの方法です)。

于 2009-11-15T02:52:39.573 に答える