【问题标题】:Programmatically initialize ViewController以编程方式初始化 ViewController
【发布时间】:2019-05-11 11:27:22
【问题描述】:

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

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


MyAwesomeController()

有没有办法以不同的方式初始化控制器,而无需传递NSCoder 对象?

如果没有,如何创建这样的对象以避免以下异常:

'NSInvalidArgumentException',原因:'*** -decodeObjectForKey:不能 发送到 NSCoder 类的抽象对象:创建一个具体的 实例!'

非常感谢您

【问题讨论】:

  • 你可以创建一个额外的初始化器。
  • 谢谢@matt,你解决了我的问题,我之前没有得到我正在创建一个新控制器,而不是我已经链接到情节提要的那个。
  • 不客气!这些文章旨在帮助解决此类常见问题。所以我很高兴能帮助你“理解”这个概念。

标签: swift uiviewcontroller initialization


【解决方案1】:

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

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 对象。感谢您的回答!
【解决方案2】:

由于 UIViewController 继承了 feom UIResponder,而 UIResponder 继承自 NSObject,所以它有类似 init() 的空初始化器。 所以你可以只调用 MyAwesomeController() 并且它可以正常工作而不会出现任何错误。 如果有任何错误,那就是故事板中的其他地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多