以编程方式初始化ViewController

7

我试图在我的Swift应用程序中初始化一个UIViewController,但我遇到了一个问题,找不到任何确定的答案。

我希望从FlowCoordinator中调用此函数来初始化该控制器,但由于所需的init?(coder:NSCoder)函数,我的初始化器需要一个NSCoder对象。


MyAwesomeController()


有没有一种方式可以初始化控制器,而不需要传递NSCoder对象?
如果没有,我该如何创建这样一个对象,以避免以下异常:
'NSInvalidArgumentException',原因:'*** -decodeObjectForKey: 无法发送到类NSCoder的抽象对象:创建一个具体实例!'
非常感谢您的帮助。

您可以创建一个额外的初始化器。 - idmean
你可能想阅读这篇文章:http://www.programmingios.net/dont-make-a-new-instance-by-mistake-2/ - matt
谢谢@马特,你解决了我的问题,我之前没有意识到我正在创建一个新控制器,而不是我已经链接到故事板的那个控制器。 - modusT
不用客气!这些文章旨在帮助解决像这样的常见问题。所以如果我能帮助你“理解”这个概念,我会非常高兴。 - matt
2个回答

11

可以使用类似这样的东西,我也包含了一个属性作为演示:

class MyAwesomeViewController: UIViewController {
    let someInt: Int

    init(someInt: Int) {
        self.someInt = someInt

        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("Storyboard are a pain")
    }
}

我喜欢通过编程来创建所有事物。


我尝试过这种方法,但它会触发fatalError,因为我在创建FlowCoordinator中的Controller时没有提供NSCoder对象。谢谢你的回答! - modusT

2
自 UIViewController 继承自 UIResponder,而 UIResponder 又继承自 NSObject,所以它有一个空的初始化器 init()。 因此,您只需调用 MyAwesomeController() 即可正常工作,无任何错误。 如果出现错误,则可能是在 storyboard 中的 outlet 中。"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接