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

时间:2011-08-11 10:22:38

标签: objective-c cocoa

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

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

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

我可以做些什么来避免在启动时集中注意力并保持使用标签键盘按钮移动的能力?

4 个答案:

答案 0 :(得分:2)

(先前)接受的答案不可靠,并且不能很好地运作。隐藏NSTextField的另一个答案并不是很好,因为现在您的Tab顺序中有一个新元素。

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

在应用启动时设置NSTextField refusesFirstResponder YES

然后,在控制器的viewDidAppear中,继续将refusesFirstResponder设置回NO

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

window?.makeFirstResponder(nil)只有在我将所有NSTextField设置为RefuseFirstResponder时才有效,但是然后使用Tab在它们之间切换当然不起作用。

答案 3 :(得分: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)
        }
}