【问题标题】:How to clear NSTextView selection without it becoming first responder?如何在不成为第一响应者的情况下清除 NSTextView 选择?
【发布时间】:2018-09-10 15:08:23
【问题描述】:

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

我的策略是扩展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() 都会导致文本视图再次成为第一响应者。

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

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

【问题讨论】:

  • 我尝试了您的代码,clearSelection 无法编译,setSelectedRange 无需更改第一响应者即可工作。

标签: cocoa appkit nstextview


【解决方案1】:

今天遇到同样的问题,找到了解决办法

您可以在NSTextView 的委托方法textDidEndEditing 中执行setSelectedRange,这不会导致NSTextView 成为第一响应者。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多