首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用primaryAction初始值设定项将UIButton子类化

如何使用primaryAction初始值设定项将UIButton子类化
EN

Stack Overflow用户
提问于 2021-10-27 00:58:59
回答 2查看 109关注 0票数 1

我们可以这样初始化一个新的UIButton:

代码语言:javascript
复制
// myAction is a var of type UIAction
let btn = UIButton(primaryAction: myAction)

所以我认为这很酷,我可以将其子类化,并停止使用target-action。但问题是,Xcode似乎无法识别primaryAction初始值设定项。

代码语言:javascript
复制
class Button: UIButton {
    init(type: String, action: UIAction) {
        super.init(primaryAction: action) // Error "Must call a designated initializer of the superclass 'UIButton'"
    }
}

所以它不是指定的初始化器。如何在UIButton子类中访问此primaryAction属性?

EN

回答 2

Stack Overflow用户

发布于 2021-10-27 01:45:02

因为您不能使用自定义初始化器中的某个方便的初始化器来初始化超类,所以您必须手动执行该便利初始化的任务。所以在你用一个指定的init初始化超类之后:

代码语言:javascript
复制
class Button: UIButton {
    init(type: String, action: UIAction) {
        super.init(frame: .zero)
        
        // register the action for the primaryActionTriggered control event
        // and set the title and image properties to the action’s title and image
    }
}

而且它不像改变单个属性的值那样简单。

通过将目标和操作与一个或多个控件事件相关联,可以设置控件,使其向目标对象发送操作消息。为此,向要指定的每个目标-操作对的控件发送addTarget(_:action:for:):。

https://developer.apple.com/documentation/uikit/uicontrol/event

票数 0
EN

Stack Overflow用户

发布于 2021-10-27 02:18:29

我想通了。我们可以使用addAction而不是addTarget。需要iOS 14+。

在UIControl的所有子类上都可以使用func addAction(_ action: UIAction, for controlEvents: UIControl.Event)。这意味着我们不再需要在我们的代码中散布目标和@objc func。只需在控件中添加一个UIAction即可。

代码语言:javascript
复制
class Button: UIButton {
    init(type: String, action: UIAction) {
        super.init(frame: .zero)
        addAction(action, for: .touchUpInside)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69731525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档