我有一个基本的 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/