【问题标题】:UIAccessibilityCustomAction selector is not working for static methodUIAccessibilityCustomAction 选择器不适用于静态方法
【发布时间】:2020-06-26 05:55:05
【问题描述】:

当我在UIAccessibilityCustomActionselector 参数中传递静态/类方法时,它不会被触发。 同样的方法适用于手势识别器/添加目标函数

自定义操作已正确设置和宣布。所以设置没有问题。但是当我双击staticTest 时不会触发。 如果我将实例方法传递给它,它就可以工作。

代码设置不起作用:

// does not work
        newView.accessibilityCustomActions?.append(
            UIAccessibilityCustomAction(
                name: "staticTest test action",
                target: ViewController.self,
                selector: #selector(ViewController.staticTest)))

代码示例:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let newView = UIView(frame: CGRect(x: 20, y: 20, width: 300, height: 300))
        newView.backgroundColor = UIColor.red
        view.isUserInteractionEnabled = true
        view.addSubview(newView)
        newView.isAccessibilityElement = true

        // works
        newView.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(instanceTest)))

        // works
        newView.accessibilityCustomActions = [
            UIAccessibilityCustomAction(name: "instanceTest test action", target: self, selector: #selector(instanceTest))
        ]

        // works
        newView.addGestureRecognizer(
            UITapGestureRecognizer(
                target: ViewController.self,
                action: #selector(ViewController.staticTest)))

        // does not work
        newView.accessibilityCustomActions?.append(
            UIAccessibilityCustomAction(
                name: "staticTest test action",
                target: ViewController.self,
                selector: #selector(ViewController.staticTest)))
    }

    @objc static func staticTest() -> Bool {
        print("staticTest")
        return true
    }

    @objc func instanceTest() -> Bool {
        print("InstanceTest")
        return true
    }
}

【问题讨论】:

    标签: ios swift uiaccessibility


    【解决方案1】:

    我尝试了您的代码,但很难相信观察结果。然后我检查了苹果文档,这是我的分析。

    尽管苹果文档没有提及使用静态/类函数作为选择器。这在措辞中间接提到了。 https://developer.apple.com/documentation/uikit/uiaccessibilitycustomaction/1620499-init

    对于 UIAccessibilityCustomAction: target:执行动作的对象。 选择器:当你想要执行操作时要调用的目标选择器。

    在您的代码中,目标是 ViewController 对象,但很难说选择器属于该对象,因为它是一个静态/类函数。实际上,swift 甚至不允许使用对象调用静态函数。 话虽如此,为什么静态函数与手势识别器一起工作还是有争议的。 https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624211-init

    这里对目标的定义略有不同。 目标:一个对象,它是接收者在识别手势时发送的动作消息的接收者。 action:一个选择器,标识目标实现的方法来处理接收者识别的手势。

    因此,您的代码完全匹配目标定义,因为 self 是应该接收手势的对象。但是动作定义并不完全匹配,因为目标(它是一个对象而不是一个类)实际上并没有实现静态函数。

    根据我的理解,静态函数需要避免作为基于文档的选择器。

    【讨论】:

    • 您链接的文档清楚地提到:当您想要执行操作时要调用的目标选择器。方法签名必须采用以下形式之一:- (BOOL)myPerformActionMethod- (BOOL)myPerformActionMethod:(UIAccessibilityCustomAction *)action 这些是 Objective-C instance 方法签名,而不是类方法。
    • 不错的收获。这清楚地表明 UIAccessibilityCustomAction 不允许使用静态函数。但是,手势识别器的行为仍然值得怀疑。与可访问性操作不同,它没有选择器作为可访问成员,因此文档中未提及选择器描述,因此很难解释为什么手势识别器接受静态功能。
    • 顺便说一句,您可以使用以下方法调用 In Swift 类(“静态”)选择器方法:stackoverflow.com/a/43714950/5329717 很麻烦,但如果您真的需要它,它就可以完成这项工作。跨度>
    • 我没有注意到文档中给出的实例方法签名。将只使用实例方法,因为那是苹果推荐的。感谢@Kamil.S 和 IFTTT 的帮助。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多