我的应用程序中有一个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事件,但似乎无法找到任何内容。
有没有办法解决这个问题?
答案 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”复选框:
Etvoilà,每当您输入一个角色时,您的财产都会立即更新,并且您的财产didSet
将立即被调用。