0

我有一种情况,我加载了一个 facebook 提要,并且根据帖子类型(视频/图像/链接等),我创建了相应的类。每种帖子类型都有不同的对应模型类和视图类,但是只有一个控制器类为每个帖子实例化。现在我需要一种动态决定在控制器内为特定帖子类型创建哪些模型和视图类的方法。现在,我有一个创建助手类,它根据帖子类型返回相应的模型和视图类。但这似乎是一种混乱的做事方式。如果有 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 回答