繁体   English   中英

在 NSTextField 上避免第一响应者的问题

[英]Problem avoiding first responder on a NSTextField

我需要在一个非常简单的应用程序中更改输入字段的行为:简单的 OSX 应用程序

每当我启动应用程序时,第一个文本字段都会获得焦点,但我不想要这种行为。

我尝试在 IB 中检查“拒绝第一响应者”。 它可以工作,但是选中此选项后,我无法按“选项卡”按钮在输入字段之间移动。

我该怎么做才能避免在启动时集中注意力并保持使用标签键盘按钮移动的能力?

(以前)接受的答案不可靠并且效果不佳。 隐藏NSTextField的另一个答案也不是很好,因为现在您的 Tab 顺序中有一个新元素。

到目前为止,我发现效果最好的解决方案是:

在应用启动时将NSTextField refusesFirstResponder YES

然后,在前面的 controller、go 的viewDidAppear中,将refusesFirstResponder设置回NO

启动后一切都表现得很完美,而且我没有贪婪的NSTextField在应用程序启动时窃取第一响应者。

我找到了解决方案,你可以添加[window makeFirstResponder:nil]; 例如在applicationDidfinishLaunching中的 awakeFromNib 之后。

window?.makeFirstResponder(nil)对我不起作用 - 当我检查谁是第一响应者时,它是 window(而不是 NSTextField),但仍然选择并激活了第一个 NSTextField。 我的解决方案(虽然我知道不是最干净的)是创建一个隐藏的文本字段,并使其成为每次 window 加载时的第一响应者。

window?.makeFirstResponder(nil)仅在我将所有 NSTextFields 设置为RefuseFirstResponder ,但随后使用 Tab 在它们之间切换当然不起作用。

这对我有用,

override func viewDidAppear() {

Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) { [weak self] (timer) in
            NSApplication.shared.windows[0].makeFirstResponder(self?.textUsername)
            let tRange = self?.textUsername.currentEditor()?.selectedRange
            self?.textUsername.currentEditor()?.selectedRange = NSMakeRange((tRange?.length)!, 0)
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM