初始化超类数组中的UIViewController子类?
这是我的设置。我将UIViewController
分类为一次,以创建一个单独的“Widget”视图控制器,该控制器处理所有我的小部件可以执行的所有操作。然后,我为每个小部件分类了Widget View Controller,因为它们各自处理它们自己独特且通常复杂的一组功能。初始化超类数组中的UIViewController子类?
我想创建一个Widget数组,用于存储每个活动小部件在我的场景中,但是我无法试图找出如何初始化适当的小部件以存储在数组中。起初,我认为我只能做[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];
,但是它完全忽略了单个小部件的initWithNibName函数,并且直接到了抽象的Widget类(这很有道理,因为这是我将它加载到的类)。
如何正确地将我的类加载到此数组中,并且每个小部件都由其自己的唯一子类初始化?如果有必要,请随意推荐结构更改。
如果类的名字是一样的笔尖
NSArray* widgets = [NSArray arrayWithObjects: @"MyVC1",@"MyVC2",nil];
NSString* newVC = [widgets objectAtIndex: value];
Class classVC = NSClassFromString(newVC);
Widget* controller = [[classVC alloc] initWithNibName:newVC bundle:nil];
的好,而不是这样的:
[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];
你可以这样做:
MySpecifc *mySpecificWidget = [[MySpecifc alloc] initWithNibName:widgetName bundle:nil];
[widgets addObject:myWidget];
我的问题在这里,这是哪里NSMutableArray
保存在哪里?
Myabe有一个Singleton所以你可以跟踪它们吗?
我的NSMutableArray存储在现场级,因为当前加载的场景处理所有的小部件。问题是我不知道MySpecific在被调用的时候是什么类,所以我不能在没有做某种查找的情况下在我的alloc中声明它。 –
我也有类似的问题,我解决了使用这样的功能在“抽象” Widget类问题:
+ (Widget)InstanceFor(widgetType)type {
switch(type) {
case widgetTypeWidgetOne:
return [[WidgetOne alloc] initWithNibName:@"WidgetOneName" bundle:nil] autorelease];
break;
case widgetTypeWidgetTwo:
return [[WidgetTwo alloc] initWithNibName:@"WidgetTwoName" bundle:nil] autorelease];
break;
}
}
凡widgetType是这样的:
typedef enum {
widgetTypeOne,
widgetTypeTwo
} widgetType;
所以你可以将Widget对象存储在数组中并在需要时进行投射。 当你想初始化一个小部件,你可以这样做:
[widgets addObject:[Widget InstanceFor:widgetTypeWidgetOne]];
这工作,很容易实现,因为我有一切正确命名。谢谢。 –
很高兴我能帮助,欢呼 – Nico