Свифт, почему я не могу использовать "self.init(type: .custom)" в инициализаторе удобства в моем подклассе UIButton

Я знаю, должен вызвать назначенный инициализатор суперкласса, я думаю, init(type: UIButtonType) вызвал назначенный инициализатор, поэтому я использовал его в удобном инициализаторе подкласса, но не смог

class TSContourButton: UIButton {
enum ContourButtonSizeType {
    case large
    case small
}

convenience init(type:ContourButtonSizeType) {
    self.init(type: .custom)
}

тогда я попробовал это. Это компилируется хорошо. но, это не выглядит профессионально

class TSClass: UIButton {

convenience init(frame: CGRect, myString: String) {
    self.init(frame: frame)
    self.init(type: .custom)
}

поэтому я сомневаюсь, что могу ошибаться. Итак, я сделал несколько тестов. Он успешно называется super convenience initializer, Почему я не могу использовать self.init(type: .custom) в удобстве инициализатора у моего подкласса UIButton?

class person: UIButton {
var name: String = "test"

override init(frame: CGRect) {
    super.init(frame: .zero)
    self.name = "one"
}

convenience init(myName: String) {
    self.init(frame: .zero)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

class man: person {
convenience init(mySex: Int) { // it successfully call superclass convenience initializer
    self.init(myName: "info")
}

1 ответ

Если, скажем, имя является вашим обязательным полем, вы реализуете все свои первоначальные настройки в функции. И вы должны справиться, если name не доступен. Я буду держать small как вариант по умолчанию, если тип не был указан.

// MARK:- Designated Initializers
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    initialSetup(type: .small)
}

override init(frame: CGRect) {
    super.init(frame: frame)

    initialSetup(type: .small)
}

// MARK:- Convenience Initializers
convenience init(type: ContourButtonSizeType) {
    self.init(frame: .zero)

    initialSetup(type: type)
}

func initialSetup(type: ContourButtonSizeType) {
    // handle all initial setup 
}

init(type: UIButtonType) не назначенный инициализатор UIButton, init(frame: CGRect) является правильно обозначенным инициализатором UIButton

вам просто нужно перезаписать init(frame: CGRect)

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let button1 = MyButton(type: .custom)
    }

}

class MyButton: UIButton {

    // 初始化父类的指定构造器,然后你就可以获得父类的便利构造器
    // overwrite the designated initializer of the super class, then you can automatically inherit the convenience initializer of the super class
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

если вы хотите настроить свою собственную кнопку, вы можете добавить convenience init(myType: UIButton.ButtonType)

    class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let button1 = MyButton(type: .custom)
        let button2 = MyButton(myType: .custom)
    }

}


class MyButton: UIButton {

    // 初始化父类的指定构造器,然后你就可以获得父类的便利构造器
    // overwrite the designated initializer of the super class, then you can automatically inherit the convenience initializer of the super class
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    // 创建自己的遍历构造器
    // this is what you want
    convenience init(myType: UIButton.ButtonType) {
        self.init(type: myType) // called the convenience initializer which you automatically inherit from super class
        // customize your own button
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Если это полезно для вас, можете ли вы дать мне подобное, ( ̄  ̄ 3 ̄)づ

Другие вопросы по тегам