在超类数组中初始化UIViewController子类?

时间:2012-05-14 13:13:16

标签: iphone objective-c ios xcode

这是我的设置。我将UIViewController子类化为一次创建一个“Widget”视图控制器,它可以处理我的所有小部件都可以执行的操作。然后我为每个小部件子类化了Widget视图控制器,因为它们每个都处理它们自己独特且通常很复杂的功能集。

我想创建一个Widgets数组,用于存储场景中的每个活动窗口小部件,但是我无法弄清楚如何初始化要存储在数组中的正确窗口小部件。最初我认为我可以做[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];,但是这完全忽略了单个小部件的initWithNibName函数,然后直接进入抽象的Widget类(这是有道理的,因为那是我正在加载它的类......) 。

如何通过自己独特的子类初始化每个小部件,如何正确地将我的类加载到此数组中?如有必要,请随意推荐结构变化。

3 个答案:

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