检测NSTextField何时变为活动状态
具体而言,我想在NSTextField
获得焦点时收到通知,或者当用户点击它并即将开始编辑时收到通知。检测NSTextField何时变为活动状态
我试过textDidBeginEditing:
方法,但只有当用户实际开始键入时才会触发,而当文本字段成为第一个响应者时,我需要它。
我试图重写-(BOOL)becomeFirstResponder
但是当文本字段第一成为第一个响应者,而不是之后,任何时候,只有叫。
我试过注册NSControlDidBeginEditing
通知,但从来没有得到任何。
这可能吗?
实现窗口的委托方法windowWillReturnFieldEditor:toObject:
。这告诉你现场编辑器正在切换到不同的对象。看看这个对象是否是文本字段。
或者,子类NSWindow并覆盖makeFirstResponder:
。请致电super
,查看响应者正在成为第一响应者以及super
的呼叫是否返回YES,并将呼叫结果返回super
。
第一个选项并不真正起作用,因为您会因为调用委托方法而淹没,而委托方法在成为第一响应者时并不总是与之配合。第二个选择是赚钱。谢谢。 –
只是要清楚@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
}
}
这是可怕的,俗气/哈克,但它确实有效。
在我的测试应用程序'becomeFirstResponder'每次被调用。 – Willeke