在分配时,如何使用字符串变量代替类名

时间:2012-07-28 22:32:05

标签: objective-c ios

我的应用程序在界面中声明了大量视图控制器,例如:

ViewController_1_0 *viewController_1_0
ViewController_1_1 *viewController_1_1
ViewController_1_2 *viewController_1_2
etc ...

(我意识到下划线对于类名来说不是一个好的Cocoa编码约定,并会改变它。)

我的目的是根据当前的UIStepper值显示适当的控制器视图。

不是对每个步进器值进行条件测试,而是使用"硬编码"执行控制器对象的单独延迟实例化。视图控制器我试图使用基于当前步进器值构造的字符串出现一次代码。

我已经找到了(在Use a Class name stored in a variable to call a Class method?的帮助下)如何设置班级名称:我已经宣布了一个属性:

@property(strong, nonatomic) Class classStringClass;

然后在为类构造变量字符串之后,我做了:

classStringClass = NSClassFromString(classString);

其中classString是使用stepper值构造的字符串,例如,等同于ViewController_1_0。

我还宣布了ivar的财产:

@property (strong, nonatomic) NSString *classInstanceString;

因此我做:

if(!classInstanceString) {
   classInstanceString = [[classStringClass alloc] initWithNibName:classString bundle:nil];
}

我遇到的问题是如何为控制器的ivar编写代码,即classInstanceString构造为等效于接口中声明的ivar viewController_1_0(或基于步进器值的任何内容)。一旦我退出惰性实例化if语句然后代码访问classInstanceString的属性,例如:

classInstanceString.view.hidden = NO;

classInstanceString可以理解得到一个错误" Property' view'没有找到类型为' NSString'"。

的对象

如何声明' classInstanceString' (或者另一个变量,比如说'classInstanceVariable'包含classInstanceString值)所以在实例化它时,它是classStringClass的ivar并且可以访问类属性,以便在类的实例化之后使用?我猜测它应该是一个与NSString不同的类型,但它会是什么类型,还是有另一种方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

如果你只需要基本的UIViewController ivars,你总是可以将它转换为UIViewController。

UIViewController *vc = (UIViewController *)[[classStringClass alloc] initWithNibName:classString bundle:nil];

[vc view];// works!

或者,如果您需要自定义ivars,如果它们都扩展了基类(或协议),那将是一个好主意:

MyBaseViewController *vc = (MyBaseViewController *)[[classStringClass alloc] initWithNibName:classString bundle:nil];

[vc customVar]; //works