使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器

Posted

技术标签:

【中文标题】使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器【英文标题】:Instantiating and pushing view controller programmatically with custom initializer swift 【发布时间】:2014-10-28 14:43:37 【问题描述】:

我想像这样快速展示一个细节视图控制器

let detailController = MyDetailUIViewController(nibName: "MyDetailUIViewController", bundle: NSBundle.mainBundle(), data:myData)
self.navigationController?.pushViewController(detailController, animated:true)

我遇到的问题是如何为 MyDetailViewController 编写初始化程序:

class MyDetailUIViewController: UIViewController 

private var data: MyData

init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!, data:MyData) 
    self.data = data
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)


required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)

我收到一个错误,即我的数据属性在 super.init 调用时未初始化。谁能解释我如何做到这一点?我确信我可以将我的数据属性设为可选并在初始化后将其传入,但肯定有一种方法可以实现这一点。

【问题讨论】:

【参考方案1】:

如果您将data 变量声明为非可选变量,则必须确保所有init 方法都对其进行初始化。在你的课堂上不是这种情况,因为

required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)

不会初始化您的data

【讨论】:

所以我从中得出的结论是,鉴于实现 init(coder aDecoder: NSCoder!) 的要求,我的数据属性必须是可选的? 是的,这就是重点。如果无法将其初始化为空:private var data: MyData = MyData()【参考方案2】:

如果您将初始化声明为convenience init(),那么您将不必为init(coder:) 声明实现,这也可以解决您的问题。

【讨论】:

以上是关于使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式实例化自定义视图控制器并通过标签获取子视图

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

使用 Swift 以编程方式自定义 UITableViewCell

使用 swift 4 以编程方式注册时未显示自定义单元格

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误

以编程方式在 UINavigationController 中设置 UINavigationBar 的自定义子类