cocoa - 如何清除 NSTextView 选择而不使其成为第一响应者?

标签 cocoa appkit nstextview

我有一个基本的 Cocoa 应用程序,其中包含许多 NSTextView。当 TextView 失去焦点(即放弃其第一响应者状态)时,我想清除其选择。

我的策略是扩展 NSTextView 并覆盖 resignFirstResponder():

override func resignFirstResponder() -> Bool {

    // Both result in the text view becoming first responder again:
    clearSelection(nil)
    setSelectedRange(NSRange(location: 0, length: 0))

    return super.resignFirstResponder()
}

问题在于调用 clearSelection()setSelectedRange() 都会导致 TextView 再次成为第一响应者。

有没有办法在不成为第一响应者的情况下清除选择?

我还尝试覆盖 acceptsFirstResponder 并暂时返回 false,但这也不起作用。

最佳答案

今天遇到同样的问题并找到解决方案

你可以在NSTextView的委托(delegate)方法textDidEndEditing中执行setSelectedRange,它不会导致NSTextView变成第一响应者。

class TextView: NSTextView {
    init() {
        self.delegate = self
        ....
    }
    ....
}

extension TextView: NSTextViewDelegate {
    public func textDidEndEditing(_ notification: Notification) {
        setSelectedRange(NSMakeRange(string.count, 0))
    }
}

关于cocoa - 如何清除 NSTextView 选择而不使其成为第一响应者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52260742/

相关文章:

cocoa - 不太了解 NSMetadataQuery

iphone - Xcode 4.x - 使其指向有问题的崩溃行

objective-c - 10.7.4 和 libPNG

cocoa - 如何禁用 NSTextView 的自动换行?

objective-c - 使用 NSTextView 伪造 NSTextField 以获得漂亮的颜色?

objective-c - 如何让 NSTextView 字符串中的字体调整为 NSTextView 大小

iphone - 如何手动强制关闭 NSURLConnection?

cocoa - 实现 Cocoa 绑定(bind)模式

objective-c - `NSTreeController` 's `排列对象` doesn' t响应`children`

ios - 如何取消正在进行的NSArray排序?