我正在尝试编写一个类型为UIView的类,但是在初始化时,我希望它采用一个额外的参数,但是我无法弄清楚如何绕过需要其参数的UIView。任何帮助深表感谢!
class MenuBar: UIView {
let homeController: HomeController
init(controller: HomeController){
homeController = controller
super.init()
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
在ViewController中,我像这样初始化它:
let menuBar: MenuBar = {
let mb = MenuBar(controller: self)
return mb
}()
Run Code Online (Sandbox Code Playgroud)
尝试这个。
class MenuBar: UIView {
let homeController: HomeController
required init(controller: HomeController){
homeController = controller
super.init(frame: CGRect.zero)
// Can't call super.init() here because it's a convenience initializer not a desginated initializer
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,这是最适合您的自定义初始化程序的最佳方法UIView:
class CustomView : UIView {
private var customProperty: CustomClass
required init(customProperty: CustomClass) {
super.init(frame: .zero)
self.customProperty = customProperty
self.setup()
}
required override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
fileprivate func setup() {
//Here all custom code for initialisation (common for all creation methods)
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法使您可以保留通用的初始化代码,而无需考虑创建视图的方法(情节提要和代码)
那是关于正确创建UIView。
另外,我建议避免传递UIViewController给UIView-我认为您正在尝试以错误的方式解决某些问题。
在这两者之间进行通信的更好的方法是使用- delegate或closure-但这有点题外话-也许您可以提出另一个问题,说明为什么要像这样通过它。
| 归档时间: |
|
| 查看次数: |
3119 次 |
| 最近记录: |