如何在Swift 2.2中更新NSResponder选择器

3

我正在实现一个NSControlTextEditingDelegate协议,但是我不知道应该与哪个类/协议匹配,例如commandSelector。#selector(WhichClass.moveUp(_ :))以便相等性通过。

目前在swift 2.1中一切正常:

func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool {

    var goUp = false
    var goDown = false

        if (commandSelector == Selector("moveUp:") ||
        commandSelector == Selector("moveBackward:") ||
        commandSelector == Selector("moveUpAndModifySelection:") ||
        commandSelector == Selector("moveParagraphBackwardAndModifySelection:")
            )

        {
            goUp = true
        }
        if (commandSelector == Selector("moveDown:") ||
        commandSelector == Selector("moveForward:") ||
        commandSelector == Selector("moveDownAndModifySelection:") ||
        commandSelector == Selector("moveParagraphForwardAndModifySelection:")
            ) {
            goDown = true

        }
//...
}
1个回答

3

试试这个:

if (commandSelector == #selector(NSResponder.moveUp) ||

如果您喜欢,可以将其写成以下形式:
if (commandSelector == #selector(NSResponder.moveUp(_:)) ||

事实上,从#selector生成的Selector实例不包含类信息。因此,您只需查找具有相同方法和签名的任何定义类即可。
如果您找不到任何类,可以在自己的协议中定义它并使用协议名称。
@objc protocol MyProtocol {
    func moveUp(_:AnyObject)
    //...
}

然后在 #selector 中使用它:

if (commandSelector == #selector(MyProtocol.moveUp(_:)) ||

后者应该是最后的选择,但实际上它确实有效。

谢谢回答。所以不需要担心相等性吗? - undefined
@MarekH,你可以轻松地检查一下,#selector(MyProtocol.moveUp(_:)) == #selector(NSResponder.moveUp) 返回 true。当两个选择器的 Objective-C 表示(例如"moveUp:")相同时,它们是相等的。不用担心。 - undefined
对于 2023 年或之后来到这里的任何人,选择器现在是 NSStandardKeyBindingResponding.moveUp - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接