UIViewController 子类的便利初始化器,带有来自 nib 的实例?

Posted

技术标签:

【中文标题】UIViewController 子类的便利初始化器,带有来自 nib 的实例?【英文标题】:Convenience initialiser for UIViewController subclass with instance from nib? 【发布时间】:2015-10-06 10:53:01 【问题描述】:

我正在尝试初始化一个名为 TestControllerUIViewController 的子类。我有这个快速课程:

class TestController : UIViewController 

    let testString : String
    @IBOutlet weak var test: UITextField!

    required init(withString string: String) 

        self.testString = string
        super.init(nibName: nil, bundle: nil)
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我还有一个名为 TestController 的 nib 文件,

里面是UIViewController 的一个实例。该文件的所有者为无(灰色的 NSObject),并且设计器中的 UIViewController 实例的类在身份检查器中设置为 TestController。有一个UITextField 实例作为出口。

问题是控制器没有从笔尖初始化(我认为),并且 textField 出口为零。

我的目标是允许通过自定义初始化程序以编程方式从 nib 初始化控制器实例。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

您有两个问题:首先,您的 nib(或 xib)没有正确创建(您不应该在界面生成器中看到 TestController)。解决这个问题的最简单方法是重新创建它:New File->Cocoa Touch Class->Create Subclass of UIViewController,别忘了勾选Also Create a XIB file

第二个问题是您没有指定要加载的 nib。您应该在初始化器的nibName 参数中指定它:

super.init(nibName: "NewlyCreatedXib", bundle: nil)

当您解决这两个问题时,我相信您的代码会正常工作。

【讨论】:

以上是关于UIViewController 子类的便利初始化器,带有来自 nib 的实例?的主要内容,如果未能解决你的问题,请参考以下文章

子类是不是从 Swift 中的超类扩展继承便利初始化程序?

UIViewController 的子类在调用 super 之前可以在 viewDidLoad 中进行一些初始化吗?

子类化 UIViewController 实现 UITableView 委托和数据源:代码重用

UIViewController 子类支持NIB加载和非

SWIFT uiviewcontroller 初始化

如何使用单个故事板uiviewcontroller为多个子类