在UIButton扩展上添加到init函数

时间:2018-12-14 13:43:45

标签: ios swift init

我想使用扩展名将自定义init添加到UIButton类中

extension UIButton {
    init() {
        backgroundColor = InterfaceDesign.button.backgroundColor
        setTitleColor(InterfaceDesign.button.textColor, for: .normal)
    }
}

第一个问题是此错误:

  

不能在'UIButton'的扩展名中声明指定的初始化程序;您是说这是一个方便的初始化方法吗?

然后,如果我单击红色的白色圆点将其修复,它将像前面这样插入便利:

convenience init()

但是随后出现此错误:

  

具有Objective-C选择器'init'的初始化器'init()'与具有相同Objective-C选择器的隐式初始化器'init()'发生冲突

我已经尝试过谷歌搜索,但是只找到了uibutton子类的工作代码...

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

无论您打算做什么,我已经在使用相同的东西。 我创建了UIButton扩展,并在其中创建了应用样式的功能。

extension UIButton {

    func setTitleFont() {
        self.titleLabel!.font = UIDevice.current.userInterfaceIdiom == .phone ? Typography.robotoBold14 : Typography.robotoBold16
    }
}

用法:

btnSave.setTitleFont()
  

注意:排版是我自定义的字体枚举。

答案 1 :(得分:3)

您无法做您想做的事情。有两个相互影响的原因。

  1. 您不能从扩展名中更改类的指定初始化程序。
  2. 可以在扩展程序中创建便捷初始化程序,但是便捷初始化程序不能替代现有的初始化程序。

您正在尝试重新定义init()。你不能那样做。您将需要创建一个便捷初始化程序,该便捷初始化程序的参数与现有的初始初始化程序不同,并且该便捷初始化程序最终需要调用指定的初始化程序。

答案 2 :(得分:1)

struct Dummy { }

extension UIButton {
    convenience init(dummy: Dummy) {
        self.init()
        backgroundColor = InterfaceDesign.button.backgroundColor
        setTitleColor(InterfaceDesign.button.textColor, for: .normal)
    }
}

UIButton(dummy: Dummy())