检测NSTextField何时变为活动状态

时间:2016-01-17 16:54:17

标签: objective-c macos cocoa nstextfield

具体来说,我希望在NSTextField获得焦点时,或者当用户点击它并即将开始编辑时收到通知。

我尝试了textDidBeginEditing:方法,但只有在用户实际开始输入时才会触发,而当文本字段成为第一个响应者时我需要它。

我已尝试覆盖-(BOOL)becomeFirstResponder,但仅当文字字段 成为第一个响应者时才会调用,而不是任何时间之后。

我已尝试注册NSControlDidBeginEditing通知但从未获得任何通知。

这可能吗?

2 个答案:

答案 0 :(得分:4)

实现窗口的委托方法windowWillReturnFieldEditor:toObject:。这告诉您字段编辑器正在切换到另一个对象。查看此对象是否为文本字段。

或者,子类NSWindow并覆盖makeFirstResponder:。致电super,查看响应者正在成为第一响应者以及对super的呼叫是否返回YES,并将呼叫结果返回super

答案 1 :(得分:2)

要明确@matt的回答让我走上了正确的道路;我以为我应该确切地说明你如何做到这一点。

  

目标

所以我希望有一个NSTextField子类知道它何时变为活动状态(即第一响应者),然后通知它的代理人。

  

问题

事实证明,OS X文本编辑的底层是一个混乱的世界,你不能真正依靠NSTextField来完成这一切。基本上,当一个参与文本编辑的对象成为第一个响应者时,某个东西(窗口,系统,NSApplication)给它一个_NSKeyboardClipView(我认为它被称为......)子视图。反过来,_NSKeyboardClipView有一个NSTextView作为子视图, ,而NSTextView成为第一个响应者

  

解决方案

•子类(或扩展)NSWindow并覆盖makeFirstResponder:方法。

•使用NSNotificationCenter发送通知,其对象是传递给makeFirstResponder:方法的响应者对象。

•在NSTextField子类中抓取通知。

•这是可怕的一点:你需要检查notification.object是否是a,NSView的子类,b)notification.object.superview.superview == self(你必须要转换为{ {1}}这里因为对象的类型为NSView}。 e.g:

id

这是可怕的,俗气的/ hacky但它​​确实有效。