1

私のアプリには、 の複数のサブクラスがありUITableViewCellます。ファクトリ クラスを使用して適切な型をインスタンス化し、それらを必要とする人に提供します。ファクトリ クラスは、セルを表すデータ オブジェクトである引数を取得します。工場はコントローラーの一部なので、それでいいと思います。

Cellfactory* factory = [[Cellfactory alloc ] initWithData:data];

問題は、そのデータ オブジェクトがファクトリ クラス内のビュー表現でマップされるときに発生します。私は2つの解決策を考えました:

  • マッピングでディクショナリを保持するために、キーはデータ オブジェクト クラスの文字列表現になり、値はそのデータ オブジェクトのレンダリングを担当するビュー クラスの文字列表現になります。そうすれば、ファクトリがデータ オブジェクトに基づいてビューを提供するように求められたときに、マップ ディクショナリを調べて、どのクラスをインスタンス化するかを知ることができます。欠点は、別のデータ オブジェクトを追加する場合、ファクトリ メソッドも変更する必要があることです (辞書に新しいエントリを追加します)。

  • 新しいオブジェクトをいくつ追加してもファクトリ メソッドを変更する必要がない、より柔軟なソリューションは、データ オブジェクト自体の内部でデータ オブジェクトのレンダリングを担当するビュー クラスの名前を保持することです。しかし、それはモデルをビューに結合し、モデルがレンダリングに関する情報を提供しなければならないのはどういうわけか適切ではありません。

では、これら 2 つのうち、どちらがより長期的な選択肢となるでしょうか? それらの両方を打ち負かす他の選択肢はありますか?

4

1 に答える 1

1

NSValueTransformerと同様のことを行い、クラスを登録できるようにすることができます。何かのようなもの+ (void)setViewClass:(Class)viewClass forDataClass:(Class)dataClass;

これは、ビューとデータ クラスごとに最も簡単な場所から登録できるため、より柔軟です。また、文字列ではなく Class オブジェクトを使用しているため、より簡潔で入力ミスが少なくなります。次に、説明したものと同様の辞書を作成できますが、文字列ではなく Class オブジェクトを使用します。Class オブジェクトは、クラス自体と同じように使用できます。例えば。[[viewClass alloc] init].

ちなみに、これにはファクトリ オブジェクトは必要ありません。のようなファクトリメソッドを使用できます+ (UITableViewCell *)cellForData:(id)data

于 2013-02-03T14:30:52.720 に答える