keyDown不会立即更新NSTextView

时间:2017-09-24 01:59:40

标签: swift macos cocoa keydown

我的应用程序中有一个keyDown函数,用于捕获名为NSTextView的{​​{1}}的输入。某些转化是通过输入完成的,该输入作为textInput附加到NSAttributedString

目前工作正常,但我遇到的问题是,NSTextView上输入文本框的值没有添加到keyDown,直到按下另一个键。

例如,如果我输入文字textInput.textStorage?.string而不再输入abcde,然后在textInput内我尝试访问func keyDown(),则会返回textInput.textStorage?.string }。

这是没有不必要部分的功能:

abcd

如果我要使用override func keyDown(with event: NSEvent) { let bottomBox = textInput.textStorage?.string // This returns one character short of what is actually in the text box if let bottomBox = bottomBox { var attribute = NSMutableAttributedString(string: bottomBox) // Do some stuff here with bottomBox and attribute // Clear and set attributed string textInput.textStorage?.mutableString.setString("") textInput.textStorage?.append(attribute) } } ,这不是问题,但keyUp的问题是,如果用户按住键,keyUp上的属性在用户释放密钥之前,请不要设置。

我可能有一种方法可以在NSAttributedString函数中以编程方式释放keyDown事件,或生成keyUp事件,但似乎无法找到任何内容。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

我喜欢做的是将Cocoa Bindings与属性观察者一起使用。像这样设置你的属性:

class MyViewController: NSViewController {
    @objc dynamic var textInput: String {
        didSet { /* put your handler here */ }
    }

    // needed because NSTextView only has an "Attributed String" binding
    @objc private static let keyPathsForValuesAffectingAttributedTextInput: Set<String> = [
        #keyPath(textInput)
    ]
    @objc private var attributedTextInput: NSAttributedString {
        get { return NSAttributedString(string: self.textInput) }
        set { self.textInput = newValue.string }
    }
}

现在将文本视图绑定到attributedTextInput并选中“Continuously Updates Value”复选框:

enter image description here

Etvoilà,每当您输入一个角色时,您的财产都会立即更新,并且您的财产didSet将立即被调用。