2

を表すエンティティと、その人物のいくつかの属性を表示PersonするUITableViewCellサブクラスがあります。

問題はこれです:あなたは通常どこでテーブルセルを設定(テキスト、画像などを設定)しますか?あなたは:

A)UITableViewController実装中にサブクラスで構成しtableView:cellForRowAtIndexPath:ますか?

B)PersonオブジェクトをUITableViewCellサブクラスに渡し、サブクラスにそれ自体を構成させますか?

C)まったく違うものはありますか?

ボーナスポイント

オプションAで答えた場合、これはどうですか?

テーブルビューの最初の行で、すべてのラベルのテキストを太字にする必要があるとします。それはあなたの意見をまったく変えますか?ここで私が得ているものがわかります。ViewControllerでセルを構成すると、ViewControllerは実際には必要のない情報で肥大化します。ただし、すべての構成をテーブルセルサブクラス内に配置すると、再利用性が失われます。これは間違いなくトレードオフですが、ほとんどのエンジニアが何を選択するのか疑問に思っています。

4

4 に答える 4

3

インターフェイスビルダーに移動し、セルを選択します。インスペクターを使用して、セルをカスタムにリンクしますUITableViewCell

インスペクター

その後、のtableView:cellForRowAtIndexPath:代わりにセルをインスタンス化しUITableViewCell、構成してボイラーします。

次に、あなたのコメントに答えます:

セルアイテムをカスタムセルのヘッダーのプロパティにリンクします。 リンクセル

この例でプロパティを作成したとしましょうUILabel cellTitle。セルをでインスタンス化するときはtableView:cellForRowAtIndexPath:、このプロパティのテキストを設定するだけです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"pedidosCell"; //the same at the nib!
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    cell.cellTitle.text = @"This is my cell title";
    // Using your Person object, that should be available here.
    cell.cellTitle.text = [Person name];

    return cell;
}

太字については、オプションAを使用UITableViewCellする必要があります。スクロールを処理するのは非常に高速であるため、a内にデータをロードすることはまれなタスクです。その中にデータを配置することは、Appleが意図したようには機能しません。

もちろん、セルにを渡すことでセルにその場所を認識させindexPath.row、必要に応じてテキストを太字に設定することができます。これがどのように機能するかわかりませんdequeueReusableCellWithIdentifier:

于 2012-09-10T21:38:43.050 に答える
2

私の通常のアプローチは、A)とB)の組み合わせのようなものです...

valueカテゴリを使用して、 UITableViewCellにプロパティを追加します。次に、表示する行/値のタイプごとに1つずつ、UITableViewCellの1つ以上のサブクラスを作成します。

データソースのtableView:cellForRowAtIndexPath:メソッドでは、適切なサブクラスのセルをデキュー/割り当て、valueその行に表示される値に設定します。

たぶん他の誰かが使用を手伝ってくれるでしょうUITableViewController-私は個人的にそれがあまり役に立たないと思います。私は通常、表示しているビューのタイプごとにUIViewControllerをサブクラス化します。そのビューにテーブルビューが含まれている場合は、ビューコントローラーにtableViewアウトレットを指定します。これは、必要なセルの種類ごとにUITableViewCellをサブクラス化するのと似ています。

于 2012-09-10T21:34:01.723 に答える
1

私はBを始めました(それはとても魅力的なようです)、そして私はまだそれで問題を抱えていません。

私のやり方は、セルサブクラスがモデルオブジェクトへの弱参照を持っているということです。コントローラはそれに参照を与え、setRefence:メソッドで表示するためにその属性を構成します。

セルサブクラスは、モデルアイテムを表示するためにのみ使用されます。これは、私のコントローラーコードが素晴らしくてクリーンであることを意味し(つまり、小さくてシンプルです)、セルバリアントの作成とプラグインが簡単であることを意味します。実際、これをさらに一般化し、サブクラスを追加するだけでディスプレイを制御できます。構成に必要な違い。それぞれが特定のセルを持つ複数のテーブルを持つ興味深いアプリは、コードがはるかに少なくなります。一般的なコントローラーを使用でき、セルのサブクラスとモデルにはそれらの詳細が含まれます。

まだマイナス面は見えません。

「しかし、そのクラスを別のプロジェクトで再利用したい場合はどうすればよいですか」-コードではなく、パターンを再利用します。

「しかし、表示オブジェクトとそれが表示するデータを緊密に結合している」-では、何でしょうか。それらは連携して機能します-コントローラーが関係を設定し、それらを調整します-それが目的です。ビューにモデルを参照させます。

(このアプローチが間違っている場合(そしてそれが罪としてリストされているのを見た場合)、なぜそれが間違っているのかを知りたいので、ここに投稿します)。

于 2013-09-01T20:14:56.317 に答える
0

「設定」とはどういう意味ですか?個人のデータをセルに追加するという意味ですか?これはcellForRowAtIndexPath:、通常はView Controllerの一部であるで行います(テーブルビューのデリゲートをView Controllerに設定するのが一般的です)。個人のデータは、理想的にはアプリケーションのモデルの一部です。インデックスパスを使用して、セルの人物を取得できます。

Person *personForThisCell = [SomeModel getPersonAtIndex: [indexPath row]];

次に、そのデータを使用してセルの値を設定します。

于 2012-09-10T21:37:11.983 に答える