在swift中动态加载类的实例

时间:2015-01-21 01:14:33

标签: ios swift uiviewcontroller xib nib

我想初始化一个在运行时指定的类的实例。我有以下设置。

//MyClass1 & MyClass2 inherit from UIViewController
let arr = MyClass1.self,MyClass2.self] 

func didSelectRow(index:Int) {
    var controllerRef = arr[index] //This returns a .Type
    var controllerClass = controllerRef() //This returns “the class” MyClass1
    //This is where I'm stuck. How do I initialize controller??

    //Finally, push VC
    self.navigationController?.pushViewController(controller, animated: true)
}

要使用Objective C初始化VC,我能够按如下方式执行此操作:

UIViewController *controller = [((UIViewController *)[controllerClass alloc]) initWithNibName:class1Nib bundle:nil];

使用Swift,我期待类似下面的语法,但它不起作用

//Doesn’t work
var controller = (controllerClass as UIViewController)(nibName: class1Nib, bundle:nil) 

//Overriding the init method in MyClass1 and then calling the below doesn’t work
var controller = controllerClass(nibName: class1Nib, bundle:nil)

//The below works, but viewDidLoad() does not get called. It only loads the nib file

var controller = UIViewController(nibName: Class1Nib, bundle:nil)

感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:3)

你的问题,其重复和无意义的“不起作用”和“下面的”,是混乱和混乱,所以我会回应假设你想要做的是实例化并推送视图控制器给定它的类,我将简单地用几行代码演示这是可能的。

这是一个返回UIViewController子类的函数:

func provideVCClass() -> UIViewController.Type {
    return ViewController.self
}

以下是来自按钮动作处理程序的行,我们调用该函数并使用该类来实例化该视图控制器并将其推送到当前导航控制器:

let vcclass = provideVCClass()
let vc = vcclass(nibName: "View", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

我向你保证,这个 工作:正确的视图控制器子类实例化,其nib 加载,其视图 出现在界面中。

所以我能回答你的问题,我不完全明白,就是Go Ye And Do同样。

编辑这是一个小小的附言。如果您的代码实际上说:

let arr = [MyClass1.self, MyClass2.self]

我建议你试着说

let arr : [UIViewController] = [MyClass1.self, MyClass2.self]

...以防Swift在这里没有推断出正确的类型。