【发布时间】:2017-06-24 00:05:15
【问题描述】:
我有一个使用故事板(OSX 10.12;Xcode 9)的 macOS 应用程序。我感兴趣的视图控制器嵌入在拆分视图控制器中,拆分视图控制器嵌入在拆分视图控制器中,拆分视图控制器是主视图控制器的内容视图控制器,因此它位于三层深度。
在这个视图控制器中,我有一个 NSTextField(“title”)和一个 NSTextView(“body”)。无论我做什么,NSTextView 都是第一响应者,我希望我的 NSTextField 成为用户输入的第一个项目。
我尝试过使用 NSApplication.shared.mainWindow?.makeFirstResponder(title) 在 ViewWillAppear 中(在 ViewDidLoad 中 mainWindow 仍然为零;谢谢,Storyboard)但它没有任何效果:调用它之后,body 仍然是第一响应者。
使用 body.resignFirstResponder() 或 title.becomeFirstResponder() 同样没有任何效果(我知道文档说“永远不要直接调用此方法”,但必须尝试);光标在文本视图中继续愉快地闪烁。
我设法通过子类化 NSTextView 创建了一个 hack,最初从“acceptsFirstResponder”返回 false,然后在我的 ViewController 的 viewDidLoad 方法中将其设置回“true”,但这很丑陋,而且只是回避了响应者链。
当 NSTextView 不想接受提示时,将我的 NSTextField 设置为第一响应者的正确方法是什么?
【问题讨论】:
-
NSTextField 是否在 NSTextView 之上?你对他们做了什么,设置内容,绑定或什么?你有没有尝试设置窗口的
initialFirstResponder? -
TextField 位于 TextView 的上方和左侧,这没有任何区别。我在 ViewDidLoad 中设置内容;我刚刚颠倒了顺序,但这没有什么区别。 initialFirstResponder 是一个有趣的——我不知道。我在 ViewWillAppear 中设置了它(这似乎是我可以访问窗口的第一个位置),虽然它会在控制台中告诉我我的 textField 是最初的第一响应者,但光标在 textView 中愉快地闪烁。跨度>
-
我无法重现您的问题,它一定是您在某个地方做了什么。
-
我现在玩得更多了,当问题出在其他地方时,我可能会责怪 NSTextView:如果我在情节提要的 ViewController 中添加两个 NSTextField,首先添加的是第一响应者,无论我做什么。
-
这似乎是一个时间问题 - 如果我在窗口控制器中添加此代码,并在 windowDidLoad 中设置 initialFirstResponder,它工作正常。但是请参见上面的回复:“故事板的三个层次”,我显然缺少一些东西。
标签: cocoa nstextview becomefirstresponder