NSTextView:在故事板应用程序中重新启动First Responder

时间:2017-06-24 00:05:15

标签: cocoa nstextview becomefirstresponder

我有一个使用故事板的macOS应用程序(OSX 10.12; Xcode 9)。我感兴趣的视图控制器嵌入在SplitViewController中,它嵌入在主ViewController的contentViewController中的SplitViewController中,所以它坐在三层深处。

在这个视图控制器中,我有一个NSTextField("标题")和一个NSTextView(" body")。无论我做什么,NSTextView都是第一个响应者,我希望我的NSTextField成为用户输入的第一个项目。

我尝试过使用NSApplication.shared.mainWindow?.makeFirstResponder(title) 在ViewWillAppear中(mainWindow在ViewDidLoad中仍为零;感谢,故事板)但它没有任何效果:在调用它之后,body仍然是第一个响应者。

使用body.resignFirstResponder()或title.becomeFirstResponder()同样没有任何效果(我知道文档说"从不直接调用此方法",但必须尝试);光标继续在文本视图中快乐地闪烁。

我设法通过子类化NSTextView来创建一个hack,最初从“acceptFirstResponder”'中返回false。并将其设置回' true'在我的ViewController的viewDidLoad方法中,但这很丑陋,只是回避响应者链。

当NSTextView不想接受提示时,将NSTextField设置为第一响应者的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我设置第一个响应者的所有尝试的真正问题是我完全没有错:在ViewWillLoad中调用的NSApplication.shared.mainWindow?.makeFirstResponder(title)似乎正是所需的方法正确的时间。

也就是说,除非将窗口设置为'restorable',否则Xcode 8/9中的窗口是默认设置。 (这让我感到困惑。文档说“如果你把你的窗口标记为可恢复的,你必须将恢复类与它们关联起来。”;这不是默认设置的,它比起初听起来要复杂一些。(见https://www.raywenderlich.com/117471/state-restoration-tutorial用于iOS教程;我将看到它有多少适用于macOS)。)

除了窗口位置和大小之外, 在启动之间保留的其中一项内容是退出应用程序时哪个界面元素处于活动状态;如果window.isRestorable设置为false,则initialFirstResponder与广告一样工作。

这是一个稍微不满意的答案,但它听起来像是这些“预期行为”问题之一,所以我可能只需要完全无法确定哪个文本元素在启动时处于活动状态。 (无论哪种方式都可以看到用例,但是窗口恢复具有足够的优势,我可能会采用它。)