NSTextField(可可)的跟踪选择范围更改

时间:2014-09-06 22:10:12

标签: objective-c xcode cocoa selection

有没有人知道我如何跟踪NSTextField.currentEditor.selectedRange的{​​{1}}值变化?

有这个奇妙的东西NSTextField,它完全符合我的需要,但它仅适用于NSTextViewDidChangeSelectionNotification

我试过和KVC / KVO一起玩,但我没有得到我想要的东西。我认为我做错了什么。

我会尝试解释我需要实现的目标。

我有NSTextView,下面我有一个标签,我想从上面的NSTextField文本选择中添加值。实时,即我希望在选择文本区域的同时,通过选择长度和NSTextField.currentEditor.selectedRange的起始位置连续更新我的标签内容。

3 个答案:

答案 0 :(得分:1)

NSTextField使用当前窗口的字段编辑器进行实际的文本编辑,这是NSTextView。要在该文字视图上订阅NSTextViewDidChangeSelectionNotification,您需要了解您的字段何时获得键盘焦点,然后询问其currentEditor

可悲的是,似乎永远不会调用controlTextDidBeginEditing:,但您可以覆盖becomeFirstResponder以获得相同的效果(请务必调用super)。

我找不到取消订阅的好地方,因为文本字段只有一秒钟的键盘焦点,然后在创建和激活字段编辑器NSTextView时丢失它。

所以最后,我正在做的是在创建视图时使用nil对象订阅通知,取消订阅dealloc,并检查通知处理程序中是否notification.object == self.currentEditor并忽略所有其他人。

答案 1 :(得分:1)

您可以在-windowWillReturnFieldEditor:toObject:代表上实施NSWindow,并为您关注的控件返回不同的字段编辑器,也许只为此设置相关的NSTextView通知现场编辑。或者,当然,您可以返回自己的NSTextView子类,虽然这可能是不必要的。

答案 2 :(得分:1)

this "retired" article中所述,“字段编辑器”将当前文本字段指定为其委托。由于字段编辑器是NSTextView实例,因此我们可以在NSTextField子类中实现任何NSTextViewDelegate方法。

- (void)textViewDidChangeSelection:(NSNotification *)notification
{
  NSRange selection = self.currentEditor.selectedRange;
  NSLog(@"selection = (location: %lu, length: %lu)", selection.location, selection.length);
}

享受! ✌️