2012-02-27 17 views
3

私はUITableViewControllerのベースセル(BaseCell - UITableViewCellのサブクラス)とBaseCellのサブクラス(SubCell、Sub2Cell、BaseCellの両方のサブクラス)を持っているので、 )。UITableViewCell - セルを設定するのに最適な場所

サブクラスは、同じ機能の一部を共有しているので、私は

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

で完全にそれらを設定している場合、私は、各細胞型のコードを繰り返すために開始します。実際のカスタムUITableViewCellクラスの中にジェネリックセットアップコードを入れるのは良い場所ですか?現在、私は簡単なセットアップ方法書いている:

- (void)setupCell 
{ 
    self.picture.layer.cornerRadius = 5.0f; 
    self.picture.layer.masksToBounds = YES; 
    self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; 
    self.picture.layer.borderWidth = 1.0f; 
} 

を、私は私のセルを作成したら、私はこれを呼び出してきた:

Sub1Cell *cell = [tableView dequeueReusableCellWithIdentifier:statusCellIdentifier]; 
[cell setupCell]; 

私はそれが自動的に呼び出されます使用することができる方法はありますか?私は試しました - (void)prepareForReuseしかし、明らかに、いつも呼び出されるのではなく、セルが再利用されているときだけです。

この問題を解決する最善の方法についてアドバイスをいただけますか?

編集:実際に私はtableView:cellForRowAtIndexPathを呼び出すたびに呼び出されているようだ

。カスタムセルを作成する正しい方法とちょっと混乱しました。

Sub1Cell *cell = [tableview dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (!cell) { 
    cell = [[Sub1Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    [cell setupCell]; 
} 

スタイルを渡しても何もしないと、カスタムセルに影響しますか?

+0

セルにストーリーボード(ダイナミックプロトタイプ)または別のxibファイルを使用しているのですか、コード内にすべてのコンテンツを追加していますか? – jrturton

+0

UILabelsやUIImageViewsのようなものをレイアウトし、コンテンツやその他の設定をコードに設定するための動的プロトタイプを備えたストーリーボードです。これはiOS 5の最適なアプローチですか? –

+0

はい、完璧です。私は以下に答えました。 – jrturton

答えて

10

あなたのセルのサブクラスでawakeFromNibを使用することができます。これは、新しいセルがストーリーボードのプロトタイプから作成されたときに呼び出されますが、セルが再利用されたときには呼び出されません。

プロトタイプを使用している場合、if(cell == nil)というものがなくなると、デキューメソッド内のすべてのものがUITableViewによって処理されます。

+0

完璧に動作します。ありがとう。 –

+0

このトピックでは、 ' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath'とセルのクラスの間に、セルを設定する場所のベストプラクティスがありますか?私は、セルのクラスのUIプロパティのようなものを設定しますが、 ' - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath'に実際のコンテンツを設定すると思います。これは、これにアプローチする良い方法のように聞こえるか?もう1つのアプローチは、セル自体にいくつかのデータ(NSDictionaryなど)を追加して、コンテンツを自身に取り込むことです。 –

0

これは大丈夫です。 tableView:cellForRowAtIndexPath:を通過する毎回ではなく、セルの作成時に呼び出している限り。あなたのサンプルコードからあなたがやっていることがわかりません。

カスタムセルのdrawRectにコードを挿入して、何が起こるかを確認することがあります。これにより、カスタムセルの場合はというトリッキーなが得られることに注意してください。 layoutSubviewsのカスタマイズについて考える必要があるかもしれません。

また、これらの特定のCALayerプロパティを設定すると、オフスクリーンレンダリングのために効果が低下する可能性がありますが、セル作成時に起こっているかのように大したことではないと思います。

UPDATE

私はあなたがテーブルビュー動作時のセルの内容を更新するコードから初期セットアップコードを分離したいと思います。最初のセットアップコードは、私のように思えますが、あなたが上に書いたものです。セルの作成時に一度だけ実行する必要があります。だから私は上記第2段落で書いたものを取り戻しています。 drawRect:に入れないでください。

MORE

Appleのドキュメントhereをチェックしてください。私はセルスタイルを渡すことの効果がわかりません... initWithStyle:reuseIdentifier:のオーバーライドでスーパーにスタイルを渡すと、スーパーはそれを使ってセルのコンテンツビューを設定すると思います。あなた自身のものでコンテンツビューを変更すると、スーパーは無駄な作業をしています。 「編集:」の下に追加したコードの残りの部分は、うまく見えると思います。

私はこれを行うたびに、InterfaceBuilderを使用します。

+0

私はここでそれを読むことができません、あなたの元の質問にコードを追加してください – QED

+0

ちょうどあなたが返信で適切な書式設定を行うことができないことに気づいた。それを質問に加えました。乾杯。 –

+0

私の初期のアプローチの一つは、 'initWithStyle'にセットアップコードを入れることでしたが、動作させることができませんでした。理想的には、それが最も理にかなっているように、それを置いておきたい場所です。 私はInterface Builderでセルをレイアウトしていますが、詳細を変更するにはコードを変更する必要があります。セルの作成中にそのコードを変更する必要がありました。 –

1

カスタムセルクラスでは、初期化するためのinitメソッドを提供します。以下のようないくつかのコード:

- (id)initWithReuseIdentifier:(NSString *)cellIdentifier 
{ 
    if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]) 
    { 
     self.picture.layer.cornerRadius = 5.0f; 
     self.picture.layer.masksToBounds = YES; 
     self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; 
     self.picture.layer.borderWidth = 1.0f; 
    } 
    return self; 
} 
+0

voidメソッドでreturn文があるようです:D –

+0

これらのメソッドのデフォルトの戻り値の型はidです。私はこのアプローチをもう一度試みます。スーパーのinitにUITableViewCellStyleDefaultを渡すと、セルの外観が変更されるかどうかは分かりますか? –

+0

@ChristopherOldfieldセルの外観はすべて自分で制御します。任意のビューをセルのcontentViewに追加します。このメソッドをBaseCellクラス内で定義します。このソリューションは、カスタマイズテーブルセルをプログラミングするためのものです。 –

関連する問題