在 swift 中动态加载 class 的实例
Loading a instance of a class dynamically in swift
我想初始化一个在运行时指定的 class 的实例。我有以下设置。
//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)
感谢任何帮助。谢谢
你的问题,重复和毫无意义 "doesn't work" 和 "the below",令人困惑和困惑,所以我会假设你想要做的是实例化并推送给定的视图控制器它 class,我将用几行代码简单地证明这是可能的。
这是一个 returns UIViewController subclass:
的函数
func provideVCClass() -> UIViewController.Type {
return ViewController.self
}
下面是按钮的操作处理程序中的几行,我们在其中调用该函数并使用 class 实例化该视图控制器并将其推送到当前导航控制器:
let vcclass = provideVCClass()
let vc = vcclass(nibName: "View", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)
我向你保证这个确实工作:正确的视图控制器子class是实例化,它的笔尖已加载,其视图确实出现在界面中。
所以我只能回答你的问题,但我并不完全理解,那就是 Go Ye And Do Likely。
编辑 这是一个小后记。如果您的代码实际上是:
let arr = [MyClass1.self, MyClass2.self]
我建议你试着说
let arr : [UIViewController] = [MyClass1.self, MyClass2.self]
...以防万一 Swift 未在此处推断出正确的类型。
我想初始化一个在运行时指定的 class 的实例。我有以下设置。
//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)
感谢任何帮助。谢谢
你的问题,重复和毫无意义 "doesn't work" 和 "the below",令人困惑和困惑,所以我会假设你想要做的是实例化并推送给定的视图控制器它 class,我将用几行代码简单地证明这是可能的。
这是一个 returns UIViewController subclass:
的函数func provideVCClass() -> UIViewController.Type {
return ViewController.self
}
下面是按钮的操作处理程序中的几行,我们在其中调用该函数并使用 class 实例化该视图控制器并将其推送到当前导航控制器:
let vcclass = provideVCClass()
let vc = vcclass(nibName: "View", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)
我向你保证这个确实工作:正确的视图控制器子class是实例化,它的笔尖已加载,其视图确实出现在界面中。
所以我只能回答你的问题,但我并不完全理解,那就是 Go Ye And Do Likely。
编辑 这是一个小后记。如果您的代码实际上是:
let arr = [MyClass1.self, MyClass2.self]
我建议你试着说
let arr : [UIViewController] = [MyClass1.self, MyClass2.self]
...以防万一 Swift 未在此处推断出正确的类型。