2012-05-14 39 views
0

这是我的设置。我将UIViewController分类为一次,以创建一个单独的“Widget”视图控制器,该控制器处理所有我的小部件可以执行的所有操作。然后,我为每个小部件分类了Widget View Controller,因为它们各自处理它们自己独特且通常复杂的一组功能。初始化超类数组中的UIViewController子类?

我想创建一个Widget数组,用于存储每个活动小部件在我的场景中,但是我无法试图找出如何初始化适当的小部件以存储在数组中。起初,我认为我只能做[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]];,但是它完全忽略了单个小部件的initWithNibName函数,并且直接到了抽象的Widget类(这很有道理,因为这是我将它加载到的类)。

如何正确地将我的类加载到此数组中,并且每个小部件都由其自己的唯一子类初始化?如果有必要,请随意推荐结构更改。

回答

2

如果类的名字是一样的笔尖

NSArray* widgets = [NSArray arrayWithObjects: @"MyVC1",@"MyVC2",nil]; 

NSString* newVC = [widgets objectAtIndex: value]; 

Class classVC = NSClassFromString(newVC); 

Widget* controller = [[classVC alloc] initWithNibName:newVC bundle:nil]; 
+0

这工作,很容易实现,因为我有一切正确命名。谢谢。 –

+0

很高兴我能帮助,欢呼 – Nico

0

的好,而不是这样的:

[widgets addObject:[[Widget alloc] initWithNibName:widgetName bundle:nil]]; 

你可以这样做:

MySpecifc *mySpecificWidget = [[MySpecifc alloc] initWithNibName:widgetName bundle:nil]; 
[widgets addObject:myWidget]; 

我的问题在这里,这是哪里NSMutableArray保存在哪里?

Myabe有一个Singleton所以你可以跟踪它们吗?

+0

我的NSMutableArray存储在现场级,因为当前加载的场景处理所有的小部件。问题是我不知道MySpecific在被调用的时候是什么类,所以我不能在没有做某种查找的情况下在我的alloc中声明它。 –

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