0

Facebook フィードをロードする状況があり、投稿の種類 (ビデオ/画像/リンクなど) に応じて、対応するクラスを作成します。各投稿タイプには対応する異なるモデル クラスとビュー クラスがありますが、各投稿に対してインスタンス化されるコントローラー クラスは 1 つだけです。ここで、特定の投稿タイプのコントローラー内に作成するモデルとビュー クラスを動的に決定する方法が必要です。現在、投稿タイプに応じて対応するモデルとビュー クラスを返す作成ヘルパー クラスがあります。しかし、それは面倒なやり方のようです。何かの投稿タイプが 20 個ある場合、それは 20 個の if ステートメントです。

これを行うより良い方法はありますか?

4

2 に答える 2

1

投稿タイプをクラス名にマッピングする plist ファイルを用意します。それを辞書に読みなさい。投稿タイプをキーにして辞書でクラス名を調べます。次に、 を使用して実際のクラスを作成しNSClassFromString()ます。

于 2012-10-11T13:52:03.923 に答える
1

タイプを処理するために使用されるクラス名に対して、投稿タイプの (ある種の)マップを保持できます。

static struct
{
    PostType type;         // A typedef'd enum with POST_TYPE_ONE, ...
    NSString *classname;
} _handlers[] = 
{
    { POST_TYPE_ONE, @"OneHandler" },
    { POST_TYPE_TWO, @"TwoHandler" },
    ....
    { POST_TYPE_TWENTY, @"TwentyHandler" }
};

const NSUInteger NUM_HANDLERS = sizeof(_handlers) / sizeof(_handlers[0]);

次に、以下を使用してクラス インスタンスをインスタンス化します。

id handler = nil;
for (NSUInteger index = 0; index < NUM_HANDLERS && handler == nil; index++)
{
    if (postType == _handlers[index].postType)
    {
        handler = [[ NSClassFromString(_handlers[index].classname) alloc ] init];
    }
}

postTypeまたは、常に 0 から 19 の間になることを保証できる場合は、クラス名の配列を保持して次を使用できます。

id handler = [[ NSClassFromString(_handlers[postType] alloc ] init];

共通の機能を提供するために、すべてのハンドラー クラスが共通の基本クラスから派生していることを確認する必要があります。

于 2012-10-11T13:56:52.270 に答える