如何判断NSSearchField/NSTextField是否有输入焦点?

问题描述 投票:0回答:4

如何判断 NSSearchField/NSTextField 是否有输入焦点?

cocoa macos
4个回答
31
投票

之前的答案是错误的,因为

NSTextField
/
NSSearchField
本身不会成为第一响应者并处理编辑后的文本。相反,他们使用窗口的字段编辑器,这是一个在窗口上的所有字段之间共享的
NSTextView
(因为一次只有其中一个字段可以获得焦点)。

您需要查看第一响应者是否是

NSText
,如果是,则搜索字段/文本字段是否是其委托人。

NSResponder *firstResponder = [[NSApp keyWindow] firstResponder];
if ([firstResponder isKindOfClass:[NSText class]] && [(id)firstResponder delegate] == mySearchField) {
    NSLog(@"Yup.");
}

13
投票

虽然 Greg Titus 的答案可能有效,但我认为以下是更好的方法:

BOOL isFirstResponder = mySearchField.currentEditor == mySearchField.window.firstResponder;

1
投票

AppKit 使用“字段编辑器”(即

NSTextView
)来处理
NSTextField
(或
NSSearchField
NSSecureTextField
)中的实际编辑。虽然您的文本字段的窗口具有键盘焦点,但它具有作为子视图的字段编辑器,并且窗口的第一响应者是字段编辑器。

所以一般来说,你可以检查文本字段是否有字段编辑器:

if textField.currentEditor() != nil {
    // textField has the keyboard focus
} else {
    // textField does not have the keyboard focus
}

但是,当您将焦点移出文本字段(通过按 Tab 键或单击另一个文本字段)时,文本字段会显示

NSControl.textDidEndEditingNotification
(Objective-C:
NSControlTextDidEndEditingNotification
)。如果文本字段有委托,并且该委托实现了
control(_:controlTextDidEndEditing:)
协议的
NSControlTextEditingDelegate
方法,则也会调用该委托方法来进行通知。

在传递此通知时(包括调用委托方法),文本字段仍将字段编辑器作为子视图,并且字段编辑器的委托仍设置为文本字段。因此,如果您不想在通知处理程序(或委托方法)中考虑文本字段仍然具有键盘焦点,那么测试字段编辑器将给出错误的答案。

(您可能认为这是一个奇怪的测试,因为毕竟 AppKit 向您发送了文本字段不再是键盘焦点的通知,所以您为什么需要询问?但也许您的通知处理程序会调用其他一些想要检查的方法,并且您不想传递一个标志“哦,顺便说一句,文本字段现在是/不是键盘焦点”。)

好吧,无论如何,在发送

NSControl.textDidEndEditingNotification
之前,AppKit 会更改文本字段窗口的第一响应者。因此,您可以检查文本字段是否有字段编辑器,以及该字段编辑器是否是其窗口的第一响应者。当您处理
NSControl.textDidEndEditingNotification
时,此测试将报告文本字段没有键盘焦点。

extension NSTextField {
    public var hasKeyboardFocus: Bool {
        guard
            let editor = currentEditor(),
            editor == window?.firstResponder
            else { return false }
        return true
    }
}

0
投票

NSTextField 在底层使用 NSFieldEditor,你可以检查

currentEditor
是否是第一个响应者

extension NSTextField {
    var isFirstResponder: Bool {
        currentEditor() == window?.firstResponder
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.