具体来说,我希望在NSTextField
获得焦点时,或者当用户点击它并即将开始编辑时收到通知。
我尝试了textDidBeginEditing:
方法,但只有在用户实际开始输入时才会触发,而当文本字段成为第一个响应者时我需要它。
我已尝试覆盖-(BOOL)becomeFirstResponder
,但仅当文字字段 成为第一个响应者时才会调用,而不是任何时间之后。
我已尝试注册NSControlDidBeginEditing
通知但从未获得任何通知。
这可能吗?
答案 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但它确实有效。