Я пытаюсь написать класс типа 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")
    }

}

В ViewController я инициализирую его так:

let menuBar: MenuBar = {
    let mb = MenuBar(controller: self)
    return mb
}()
10
Spencer Bigum 2 Янв 2018 в 23:11

2 ответа

Лучший ответ

Попробуй это.

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")
    }

}
10
Hakim 2 Янв 2018 в 20:35

По моему опыту, это то, что лучше всего работает, если вы хотите иметь собственный инициализатор для 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)
    }
}

Этот подход позволяет сохранить общий код инициализации независимо от метода создания представления (как раскадровки, так и кода).

Речь идет о правильном создании UIView.

Кроме того, я бы рекомендовал избегать передачи UIViewController в UIView - я думаю, вы пытаетесь решить какую-то проблему неверным способом.

Гораздо лучший способ общения между этими двумя - использовать delegate или closure - но это немного не по теме - возможно, вы можете задать еще один вопрос о том, почему вы хотите передать это таким образом.

5
Grzegorz Krukowski 2 Янв 2018 в 20:21