代码之家  ›  专栏  ›  技术社区  ›  Rob Sanders

正在检测NSTextField何时变为活动状态

  •  9
  • Rob Sanders  · 技术社区  · 9 年前

    具体来说,我希望在 NSTextField 获得焦点,或者当用户单击它并准备开始编辑时。

    我试过了 textDidBeginEditing: 方法,但这仅在用户实际开始键入时触发,并且当文本字段成为第一响应者时我需要它。

    我试过超越 -(BOOL)becomeFirstResponder 但只有当文本字段 第一 成为第一响应者,而不是之后的任何时候。

    我已尝试注册 NSControlDidBeginEditing 通知,但从未收到任何通知。

    这可能吗?

    2 回复  |  直到 9 年前
        1
  •  4
  •   matt    9 年前

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

    或者,子类化NSWindow并重写 makeFirstResponder: 呼叫 super ,查看哪些响应者将成为第一响应者,以及是否 超级的 返回YES,并将调用结果返回给 超级的 .

        2
  •  3
  •   Rob Sanders    9 年前

    只是为了清楚 @matt 他的回答使我走上了正确的道路;我想我应该澄清一下你是如何做到这一点的。

    目标

    所以我想有一个 NSTextField 子类,它将知道它何时变为活动的(即第一响应者),然后通知它的委托。

    问题

    事实证明,OSX文本编辑的背后是一个混乱的世界,你不能真正依赖它 NSText字段 做这一切。基本上,当涉及文本编辑的对象成为第一响应者时 NSApplication )给它一个 _NSKeyboardClipView (我认为这叫做…)作为子视图。反过来 _NS键盘剪辑视图 有一个 NSTextView 作为子视图, 这是 NST文本视图 成为第一反应者 .

    解决方案

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

    使用 NSNotificationCenter who的对象是传递给 makeFirstResponder: 方法

    在您的 NSText字段 子类。

    这里有一个可怕的地方:你需要检查 notification.object 是,a)的子类 NSView 以及,b) notification.object.superview.superview == self (你必须投给 NS视图 因为对象的类型 id ). 例如:

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

    这很可怕,很俗气,但确实管用。