2017-06-24 35 views
0

我有一个macOS应用程序使用故事板(OSX 10.12; Xcode 9)。我感兴趣的视图控制器嵌入在SplitViewController中,该视图嵌入SplitViewController中,该ViewViewController是主ViewController的contentViewController,因此它坐落在三层深处。NSTextView:辞去故事板应用程序中的第一个响应者

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

我一直在使用NSApplication.shared.mainWindow试图.makeFirstResponder(标题) 在viewWillAppear中(主窗口仍然是零在viewDidLoad中;感谢,故事板),但它没有任何作用:调用此之后,身体仍然是第一个响应。 (我知道文档说“不要直接调用这个方法”,但它不得不尝试);但是,如果使用body.resignFirstResponder()或title.becomeFirstResponder()光标在文本视图中继续快速闪烁。

我设法通过继承NSTextView来创建一个hack,最初从'accepterFirstResponder'返回false并将其设置回到'true',但这很丑陋,只是回避了响应者链。

什么设置我的NSTextField作为第一个响应时NSTextView只是不希望心领神会的正确方法是什么?

+0

是在NSTextView以上的NSTextField?你对他们做了什么,设定内容,装订或其他?你有没有尝试设置窗口的'initialFirstResponder'? – Willeke

+0

TextField在TextView的左上方,这没有什么区别。我在ViewDidLoad中设置内容;我刚刚逆转了顺序,但这没有什么区别。 initialFirstResponder是一个有趣的 - 我不知道这一点。我已经在ViewWillAppear中设置了它(这似乎是我可以访问窗口的第一个地方),虽然它会在控制台中告诉我,我的textField是最初的第一响应者,但光标在textView中愉快地闪烁。 –

+0

我不能重现你的问题,它肯定是你以某种方式做某事的地方。 – Willeke

回答

0

与我设置第一响应者的所有尝试的真正问题是,我绝对没有错:在ViewWillLoad中调用的NSApplication.shared.mainWindow?.makeFirstResponder(title)看起来正是需要调用的方法恰到好处的时间。

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

一个是确实得到保留发布会之间,比窗口的位置和大小等的东西,是一种界面元素处于活动状态时你退出了应用程序;当window.isRestorable设置为false时,initialFirstResponder将按照广告方式工作。

这是一个稍微不令人满意的答案,但它听起来像这些“预期行为”的问题之一,所以我可能只是不得不忍受被完全无法确定文本元素上推出积极的。 (我可以看到使用情况无论哪种方式,但窗口恢复有足够的优势,我很可能会采用它。)

相关问题