【问题标题】:Loading a instance of a class dynamically in swift快速动态加载类的实例
【发布时间】:2015-03-19 10:18:20
【问题描述】:

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

//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)

感谢任何帮助。谢谢

【问题讨论】:

  • 这是关于 nib 文件还是关于按其类实例化视图控制器?
  • 这不是代码:let arr = MyClass1.self,MyClass2.self] 在 Stack Overflow 上提问时需要提供真实代码
  • 这是关于实例化视图控制器的。对不起,我已经编辑了标题。这是真实的代码,我不必提供真实的类名和变量 - 有无数的帖子包含 FooBar 示例。

标签: ios swift uiviewcontroller xib nib


【解决方案1】:

您的问题带有重复且毫无意义的“不起作用”和“以下内容”,令人困惑和困惑,因此我将假设您想要做的是实例化并推送给定其类的视图控制器,我将简单地用几行代码证明这是可能的。

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

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

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

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

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

所以我只能回答你的问题,我不完全理解,就是去做。

编辑这里有一点后记。如果您的代码实际上说:

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

我建议你试试说

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

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

【讨论】:

  • 您的回答有效,谢谢。说“不起作用”并不是毫无意义的。这意味着我已经尝试了几个选项并花了几个小时。我帖子中的“以下”指的是紧随其后的那一行。我不知道这是怎么回事!
  • @user714223 如果您不喜欢我的回答,请不要接受!
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多