有没有人知道如何跟踪NSTextField.currentEditor.selectedRange
的NSTextField
值变化?
有这个奇妙的东西NSTextViewDidChangeSelectionNotification
,它完全符合我的需要,但它只适用于NSTextView
。
我试过和KVC / KVO玩,但我得不到我想要的东西。我认为我做错了什么。
我将尝试解释我需要实现的目标。
我有NSTextField
,下面我有一个标签,我想把NSTextField.currentEditor.selectedRange
的文本选择上面的值。实时地,即我想在选择文本区域的同时用NSTextField.currentEditor.selectedRange
的选择长度和起始位置连续更新我的标签内容。
NSTextField
使用当前窗口的字段编辑器进行实际的文本编辑,这是一个NSTextView
。要在该文本视图上订阅NSTextViewDidChangeSelectionNotification
,您需要找出您的字段何时获得键盘焦点,然后询问它的currentEditor
。
可悲的是,似乎从未调用controlTextDidBeginEditing:
,但你可以覆盖becomeFirstResponder
以获得相同的效果(一定要调用super)。
我找不到取消订阅的好地方,因为文本字段只有一秒钟的键盘焦点,然后在创建和激活字段编辑器NSTextView时丢失它。
所以最后,我正在做的是在创建视图时使用nil
对象订阅通知,在dealloc中取消订阅,并检查通知处理程序中是否有notification.object == self.currentEditor
并忽略所有其他对象。
您可以在-windowWillReturnFieldEditor:toObject:
委托上实现NSWindow
,并为您关注的控件返回一个不同的字段编辑器,也许只为该字段编辑器设置相关的NSTextView
通知。或者,当然,您可以返回自己的NSTextView
子类,尽管这可能不必要。
正如this "retired" article中所提到的,“字段编辑器”将当前文本字段指定为其委托。由于字段编辑器是NSTextView
实例,我们可以在NSTextViewDelegate
子类中实现任何NSTextField
方法。
- (void)textViewDidChangeSelection:(NSNotification *)notification
{
NSRange selection = self.currentEditor.selectedRange;
NSLog(@"selection = (location: %lu, length: %lu)", selection.location, selection.length);
}
请享用! ✌️