检测NSTextField何时变为活动状态

问题描述:

具体而言,我想在NSTextField获得焦点时收到通知,或者当用户点击它并即将开始编辑时收到通知。检测NSTextField何时变为活动状态

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

我试图重写-(BOOL)becomeFirstResponder但是当文本字段第一成为第一个响应者,而不是之后,任何时候,只有叫。

我试过注册NSControlDidBeginEditing通知,但从来没有得到任何。

这可能吗?

+0

在我的测试应用程序'becomeFirstResponder'每次被调用。 – Willeke

实现窗口的委托方法windowWillReturnFieldEditor:toObject:。这告诉你现场编辑器正在切换到不同的对象。看看这个对象是否是文本字段。

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

+0

第一个选项并不真正起作用,因为您会因为调用委托方法而淹没,而委托方法在成为第一响应者时并不总是与之配合。第二个选择是赚钱。谢谢。 –

只是要清楚@matt的回答让我走上了正确的道路;我认为我应该明确说明你如何做到这一点。

目的

所以我想有一个NSTextField子类,当它开始活跃起来,将知道(即第一响应),然后通知它的委托。

问题

原来的OS X文字编辑的引擎盖下是一个混乱的世界,你不能真正依靠NSTextField做这一切。基本上,当涉及文本编辑的对象成为第一响应者时,某些东西(窗口,系统,NSApplication)会给它一个_NSKeyboardClipView(我认为它被称为...)作为子视图。反过来,_NSKeyboardClipView有一个NSTextView作为子视图,,它的NSTextView成为第一响应者

•子类(或扩展)NSWindow并重写makeFirstResponder:方法。

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

•在NSTextField子类中捕获通知。

•下面是可怕的一点:你需要检查notification.object是,一)NSView子类和b)的notification.object.superview.superview == self(你将不得不转换为NSView这里,因为对象将是id类型)。例如:

- (void)didBecomeFirstResponder:(NSNotification *)note 
{ 
    if ([note.object isKindOfClass:[NSView class]] && [[(NSView *)note.object superview] superview] == self) { 
     // You just became the first responder 
    } 
} 

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

+0

在我的测试应用程序中'makeFirstResponder'也被称为文本字段。 'didBecomeFirstResponder'中的测试只是'note.object = self'。 – Willeke

+0

@Willeke是的,它确实叫它,但只是第一次。 –

+0

奇怪,像'becomeFirstResponder',每次都会调用'makeFirstResponder'。 – Willeke