我的应用程序中有一个keyDown
函数,用于捕获名为NSTextView
的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
函数期间以编程方式释放keyDown事件,或者生成keydup事件,但是似乎什么也找不到。有办法解决这个问题吗?
最佳答案
我喜欢做的是使用带有属性观察者的Cocoa绑定。按如下方式设置属性:
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
,并选中“持续更新值”复选框:等等,您的属性将在每次键入字符时立即更新,并且您的属性的
didSet
将立即被调用。关于swift - keyDown不会立即更新NSTextView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46385858/