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

How to update NSResponder selector in swift 2.2

我正在实施 NSControlTextEditingDelegate 协议,但我不知道我应该匹配哪个 class/protocol,例如命令选择器。 #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

        }
//...
}

试试这个:

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

如果你愿意,可以这样写:

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

事实上,从 #selector 生成的 Selector 实例不包含 class 信息。因此,您只需找到任何 class 定义具有相同签名的相同方法。


如果找不到任何 class,您可以在自己的协议中定义它并使用协议名称。

@objc protocol MyProtocol {
    func moveUp(_:AnyObject)
    //...
}

并在#selector中使用:

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

后者应该是最后一种方式,但确实有效。