2012-10-11 21 views
0

我有一种情况,我加载Facebook的饲料,并根据职位类型(视频/图像/链接等),我创建相应的类。每个帖子类型都有不同的对应模型类和视图类,但是每个帖子只有一个实例化的控制器类。 现在我需要一种动态决定在控制器内为特定的帖子类型创建哪个模型和视图类的方法。现在,我有一个创建辅助类,它根据帖子类型返回相应的模型和视图类。但这似乎是一种凌乱的做事方式。如果有20个帖子类型,那20个东西如果语句。正确的方式来动态决定创建哪个类

有没有更好的方法来做到这一点?

回答

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]; 

您应确保所有处理程序类都来自公共基类,以提供通用功能。

+0

是的,这与我想到的方法类似。只是想知道是否有更好的方式,我错过了。谢谢 –

+0

@KhalidBajwa除了你有20件事'if'陈述,现在你不... – trojanfoe

+0

嗯,我的意思是,我发布了这个问题后,我想出了一个类似的方法,但我让问题万一有人想出了更好的想法。你的答案肯定有帮助。谢谢 :) –

1

有一个plist文件将帖子类型映射到类名称。把它读入字典。使用帖子类型作为键在字典中查找类名。然后使用NSClassFromString()创建实际的班级。

+0

好主意,但我想在代码中做到这一点,以避免错误地命名类的风险。 –