如何将额外的参数传递给自定义UIView类以进行快速初始化

Spe*_*gum 9 uiview swift

我正在尝试编写一个类型为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)

Hak*_*kim 7

尝试这个。

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)


Grz*_*ski 5

根据我的经验,这是最适合您的自定义初始化程序的最佳方法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。

另外,我建议避免传递UIViewControllerUIView-我认为您正在尝试以错误的方式解决某些问题。

在这两者之间进行通信的更好的方法是使用- delegateclosure-但这有点题外话-也许您可以提出另一个问题,说明为什么要像这样通过它。