我的应用程序中有一个keyDown函数,用于捕获名为NSTextViewtextInput的输入。一些转换是通过将输入作为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,并选中“持续更新值”复选框:
swift - keyDown不会立即更新NSTextView-LMLPHP
等等,您的属性将在每次键入字符时立即更新,并且您的属性的didSet将立即被调用。

关于swift - keyDown不会立即更新NSTextView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46385858/

10-14 21:20