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

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

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

每当我启动应用程序时,第一个文本字段就会获得焦点,但我不希望出现这种行为。

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

我该怎么做才能避免启动时聚焦并保持使用选项卡键盘按钮移动的能力?

objective-c cocoa
5个回答
3
投票

(之前)接受的答案不可靠并且效果不佳。隐藏的

NSTextField
的另一个答案也不是很好,因为现在您的 Tab 顺序中有一个新元素。

迄今为止我发现最有效的解决方案是:

在应用程序启动时制作

NSTextField refusesFirstResponder
YES

然后,在控制器的

viewDidAppear
中,继续将
refusesFirstResponder
设置回
NO

启动后一切都表现得很完美,而且我没有贪婪的

NSTextField
在应用程序启动时窃取第一响应者。


1
投票

我找到了解决方案,您可以在 awakeFromNib 之后添加

[window makeFirstResponder:nil];
例如在
applicationDidfinishLaunching
中。


0
投票

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

仅当我将所有 NSTextFields 设置为

window?.makeFirstResponder(nil)

 时,
RefuseFirstResponder
才起作用,但是使用 Tab 在它们之间切换当然不起作用。


0
投票

这对我有用,

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)
        }
}

0
投票

这是一篇很旧的帖子,但以防万一有人还在看。

您需要的是在您的窗口对象上设置initialFirstResponder: - 执行它所说的操作 - 选择开始具有第一个响应者的字段。

© www.soinside.com 2019 - 2024. All rights reserved.