这是我的设置。我将UIViewController
子类化为一次创建一个“Widget”视图控制器,它可以处理我的所有小部件都可以执行的操作。然后我为每个小部件子类化了Widget视图控制器,因为它们每个都处理它们自己独特且通常很复杂的功能集。
我想创建一个Widgets数组,用于存储场景中的每个活动窗口小部件,但是我无法弄清楚如何初始化要存储在数组中的正确窗口小部件。最初我认为我可以做[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];
,但是这完全忽略了单个小部件的initWithNibName函数,然后直接进入抽象的Widget类(这是有道理的,因为那是我正在加载它的类......) 。
如何通过自己独特的子类初始化每个小部件,如何正确地将我的类加载到此数组中?如有必要,请随意推荐结构变化。
答案 0 :(得分:2)
如果类的名称与nib相同
NSArray* widgets = [NSArray arrayWithObjects: @"MyVC1",@"MyVC2",nil];
NSString* newVC = [widgets objectAtIndex: value];
Class classVC = NSClassFromString(newVC);
Widget* controller = [[classVC alloc] initWithNibName:newVC bundle:nil];
答案 1 :(得分:0)
好吧而不是这个:
[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];
你可以这样做:
MySpecifc *mySpecificWidget = [[MySpecifc alloc] initWithNibName:widgetName bundle:nil];
[widgets addObject:myWidget];
我的问题是,NSMutableArray
存储在哪里?
Myabe有一个Singleton所以你可以跟踪它们吗?
答案 2 :(得分:0)
我有类似的问题,我在“抽象”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]];