You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:24:02