我有一个超类ViewController
class ViewController : UIViewController { /* no init here */ }
我有很多继承自ViewController的viewControllers 例如,这个
class AddHoraire : ViewController { /* I want an init for this class */ }
我可以初始化一个子类吗?它问我是否也需要我单击修订的init,但是我需要用什么写吗?
这是错误: http://www.noelshack.com/2018-52-7-1546133576-93491c85-f2eb-4b8a-bfff-35ae5763c59a.jpeg
答案 0 :(得分:0)
您通常不会为UIViewController
的子类定义新的初始化器。这样做将需要您使用这些确切的签名覆盖init(coder:)
和init(nibName:, bundle:)
,因此无法为自定义属性提供值。
在您的自定义VC中添加一个设置功能,并在文档中提到必须在准备好使用VC之前调用它:
class AddHoraire : ViewController {
var anInt: Int!
var aString: String!
/// This method must be called before this class is ready for use
func setup(anInt: Int, aString: String) {
loadViewIfNeeded() // in case you need to access the outlets
self.anInt = anInt
self.aString = aString
}
}
用法:
let vc = AddHoraire()
vc.setup(anInt: 42, aString: "Hello world")
答案 1 :(得分:0)
尝试初始化时,
init(SelectedDay: String) {
super.init()
selectedDay = SelectedDay
}
您遇到错误,“必须调用超类ViewController的指定初始化程序”
由于您没有在ViewController
上定义指定的初始值设定项,因此您将继承其超类UIViewController
(即init(nibName: String?, bundle: Bundle?)
)的指定初始值设定项。
要解决此问题,请向ViewController
添加一个初始化程序。让它调用指定的初始化程序。您还必须应用修复程序来生成init?(coder:)
。
class ViewController: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后回到AddHoraire
,假设您拥有selectedDay
属性。必须在调用super.init()
之前 进行设置。我也建议不要大写参数名称。只需使用相同的名称,然后使用self.
来识别属性即可区分参数和属性。
class AddHoraire : ViewController {
private let selectedDay: String
init(selectedDay: String) {
self.selectedDay = selectedDay
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}