iOS:在 Swift 中重新创建 addTarget() 的最佳实践?

标签 ios swift uicontrol

我正在创建一个自定义的 UIControl 子类,并想添加一个类似于 UIButton 的 addTarget() 函数。我该如何正确地做到这一点?到目前为止我有这个(它有效,但不确定是否是一个好的解决方案):

import UIKit

class RichLabel: UIControl {

    var labelTarget: Any?
    var labelAction: Selector?

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

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

    func addTarget(_ target: Any?, action: Selector) {
        self.labelTarget = target
        self.labelAction = action
    }

    func buttonAction() {

        if let labelTarget = labelTarget, let labelAction = labelAction {               
         let _ = (labelTarget as AnyObject).perform(labelAction, with: self)
    }
}

目标是从另一个 View 添加的,像这样:

var richLabel: RichLabel {
    let label = RichLabel()
    label.setAttributedText(title: string)
    label.addTarget(self, action: #selector(richLabelAction(label:)))
    return label
}

最佳答案

如果您继承自 UIControl,则无需对 addTarget 执行任何操作。调用者将在您的自定义 UIControl 上使用 addTarget,就像他们使用任何其他控件一样。您的自定义控件所要做的就是决定何时调用这些操作,然后调用 sendActions(for:)

如果您的目标是让这个 RichLabel 类功能像按钮一样,我会向它添加一个 UITapGestureRecognizer,并在手势识别器中调用 self.sendActions(对于:.touchUpInside)

class RichLabel: UIControl {

    override init(frame: CGRect) {
        super.init(frame: frame)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(labelTapped))
        addGestureRecognizer(tapGesture)
    }

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

    @objc func labelTapped() {
        // When this happens, any object that called `addTarget`
        // for the .touchUpInside event will get its callback triggered
        sendActions(for: .touchUpInside)
    }

}

关于iOS:在 Swift 中重新创建 addTarget() 的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328450/

相关文章:

iphone - 使用quartz自定义UIBarButtonItem

ios - 确认 iPhone 用户

ios - 无法在 iOS SDK 上创建 Facebook 测试用户帐户

ios - xcode的功能文档准备

ios - For 循环在自定义函数中不起作用

swift - 如何使用 swift 4 将 int 变量插入到 firebase

ios - 快速更改 UINavigationBar 中 UIBarButtonItem 的位置

ios - 迦太基更新时出现 Alamofire 错误

ios - 自定义 UIControl,调用两次的操作

ios - 如何在 Swift 中实现范围 slider