Objective c NSTextField(cocoa)的轨迹选择范围更改
有人知道我如何跟踪Objective c NSTextField(cocoa)的轨迹选择范围更改,objective-c,xcode,cocoa,selection,Objective C,Xcode,Cocoa,Selection,有人知道我如何跟踪NSTextField.currentEditor.selectedRange对NSTextField的值更改吗 有一个奇妙的东西NSTextView didchangeselectionnotification,它完全满足了我的需要,但它只适用于NSTextView 我试着玩KVC/KVO,但我没有得到我想要的。我想我做错了什么 我将努力解释我需要实现的目标 我有NSTextField,下面我有一个标签,我想把上面文本选择的NSTextField.currentEditor.
NSTextField.currentEditor.selectedRange
对NSTextField
的值更改吗
有一个奇妙的东西NSTextView didchangeselectionnotification
,它完全满足了我的需要,但它只适用于NSTextView
我试着玩KVC/KVO,但我没有得到我想要的。我想我做错了什么
我将努力解释我需要实现的目标
我有
NSTextField
,下面我有一个标签,我想把上面文本选择的NSTextField.currentEditor.selectedRange
中的值放在这里。实时更新标签内容,即我希望在选择文本区域时,使用选择长度和起始位置从NSTextField.currentEditor.selectedRange
连续更新标签内容。NSTextField
使用当前窗口的字段编辑器进行实际文本编辑,这是一个NSTextView
。要在该文本视图上订阅NSTextViewDidChangeSelectionNotification
,您需要找出字段何时获得键盘焦点,然后向其索取currentEditor
遗憾的是,似乎从未调用过controlTextDidBeginEditing:
,但您可以重写becomeFirstResponder
,以获得相同的效果(请务必调用super)
但是我找不到退订的好地方,因为文本字段只有一瞬间的键盘焦点,然后在创建并激活字段编辑器NSTextView时丢失
最后,我要做的是在创建视图时使用
nil
对象订阅通知,取消订阅dealloc,并检查通知处理程序中的notification.object==self.currentEditor
,并忽略所有其他项。您可以在NSWindow
委托上实现-windowWillReturnFieldEditor:toObject:
,并为您关心的控件返回不同的字段编辑器,可能只为该字段编辑器设置了相关的NSTextView
通知。当然,您也可以返回自己的NSTextView
子类,尽管这在这里可能是不必要的。如中所述,“字段编辑器”将当前文本字段指定为其委托。由于字段编辑器是一个实例,我们可以在NSTextField
子类中实现任何方法
- (void)textViewDidChangeSelection:(NSNotification *)notification
{
NSRange selection = self.currentEditor.selectedRange;
NSLog(@"selection = (location: %lu, length: %lu)", selection.location, selection.length);
}
享受吧!✌️
controlTextDidBeginEditing:
方法在进行更改后被调用,文档在这里提到: