如何在 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(_:)) ||
后者应该是最后一种方式,但确实有效。
我正在实施 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(_:)) ||
后者应该是最后一种方式,但确实有效。