我正在创建一个自定义的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)
    }
}

从另一个视图添加目标,如下所示:
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(for: .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 - iOS:在Swift中重新创建addTarget()的最佳实践?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48328450/

10-09 05:49