0

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

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

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

我的意图是根据当前的 UIStepper 值呈现适当的控制器视图。

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

我已经弄清楚(在使用存储在变量中的类名来调用类方法的帮助下?)如何设置类名:我已经声明了一个属性:

@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 会收到错误“在 'NSString' 类型的对象上找不到属性 'view'”。

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

4

1 回答 1

0

如果你只需要基本的 UIViewController 变量,你总是可以将它转换为 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
于 2012-07-28T22:47:24.030 回答