Tha*_*nks 3 iphone cocoa-touch objective-c uikit
例:
我有10个视图控制器,它们都以相同的方式分配和初始化:
UIViewController *controller = [[MyViewController alloc] initWithNib];
Run Code Online (Sandbox Code Playgroud)
(注意-initWithNib是UIViewController子类的自定义方法)
下一个视图控制器类是OtherViewController,依此类推.我想懒洋洋地加载视图控制器,就在我需要的时候.但要做到这一点,我需要有一些"数组",它将给我一个给定索引的相应类,以便我可以初始化它.
我最终创建了一个带有大型switch语句的方法,它将为每个单独的视图控制器分别进行令人讨厌的分配和初始化.我对此并不满意.如果我可以将适当的类分配给变量,然后在switch语句的末尾,只需从变量中分配和初始化该类,那就更好了.
有没有办法实现这一目标?
编辑:我找到了一个功能
id class_createInstance(Class cls, size_t extraBytes)
Run Code Online (Sandbox Code Playgroud)
每个班级似乎都有一个属性"类".但我无法将其分配给实例变量.这不起作用:
Class cls = [UIImage class];
cls *image = [cls imageNamed:@"avatar.png"];
Run Code Online (Sandbox Code Playgroud)
第一行编译.但第二个给出了一个错误:"图像未声明".
Jas*_*son 13
如果在编译时知道类的名称,则可以将类分配给类变量.例如:
static Class factory[2];
factory[0] = [MyViewController1 class];
factory[1] = [MyViewController2 class];
...
Run Code Online (Sandbox Code Playgroud)
然后你可以拥有(classid将是一个在编译时已知的常量,它将映射到所需的类:
-(UIViewController*)createViewController:(int)classid
{
return [[factory[classid] alloc] init];
}
Run Code Online (Sandbox Code Playgroud)
假设该方法是在名为MyFactory的类中定义的,那么您可以执行以下操作:
MyFactory * fac = [[MyFactory alloc] init];
UIViewController * v1 = [fac createViewController: 0]; // typed
id v2 = [fac createViewController: 1]; // untyped
Run Code Online (Sandbox Code Playgroud)
如果您没有该类的编译时名称,则只需执行以下操作:
#include <objc/objc-runtime.h>
id object = [[NSClassFromString(@"TheClassName") alloc] init];
Run Code Online (Sandbox Code Playgroud)
由于您的原始问题涉及一组UIViewControllers,因此没有理由使用后一种方法失去类型安全性.
你想使用反射:
id controller = class_createInstance(NSClassFromString(@"your class name"), 0/*extra bytes*/);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4377 次 |
| 最近记录: |