如何使用primaryAction构造器对UIButton进行子类化
你遇到的报错是正常的,init(primaryAction:)是UIButton的便利构造器,Swift的初始化规则明确要求:子类的指定构造器必须直接调用父类的指定构造器,不允许直接调用父类的便利构造器。
下面是两种可行的解决方案:
方案1:调用父类指定构造器,手动管理UIAction(推荐,灵活度更高)
直接调用UIButton的指定构造器,之后手动添加传入的UIAction,同时可以自定义按钮类型等其他参数:
class Button: UIButton { init(buttonType: UIButton.ButtonType = .system, action: UIAction) { // 调用父类指定构造器 super.init(frame: .zero) // 手动添加点击事件的Action addAction(action, for: .touchUpInside) // 此处可添加自定义的初始化逻辑,比如设置统一的样式、圆角等 } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
初始化之后你可以直接通过primaryAction属性读写按钮的关联动作:
// 赋值新的primaryAction yourButton.primaryAction = newAction // 读取当前的primaryAction print(yourButton.primaryAction)
方案2:将子类构造器声明为便利构造器
如果不需要自定义父类的核心初始化参数,可以把自己的构造器声明为便利构造器,即可直接调用父类的init(primaryAction:):
class Button: UIButton { convenience init(action: UIAction) { // 便利构造器允许调用父类的便利构造器 self.init(primaryAction: action) // 此处添加自定义初始化逻辑 } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
注意:这种方式创建的按钮默认是system类型,无法自定义按钮类型,灵活度低于第一种方案。
内容的提问来源于stack exchange,提问作者Tad
相关产品推荐
相关产品推荐

