为啥设置 initialFirstResponder 没有效果?

Posted

技术标签:

【中文标题】为啥设置 initialFirstResponder 没有效果?【英文标题】:Why does setting initialFirstResponder have no effect?为什么设置 initialFirstResponder 没有效果? 【发布时间】:2011-08-23 07:56:48 【问题描述】:

我有一个带有 3 个文本字段的简单表单 (NSWindow)。 NSWindow 的initialFirstResponder '指向' 到第一个字段(NSTextField)。所有三个文本字段都通过nextKeyView相互循环链接。

我遇到的问题是,当我从 Xcode 启动应用程序时,它会关注应用程序关闭时上次活动(焦点)的文本字段。

例如,如果我将文本字段命名为 A、B 和 C,并将 initialFirstResponder 设置为 A。现在如果我启动应用程序,关注 B,然后关闭应用程序,下次启动它时,焦点将在 B 上。

为什么会这样,我该如何解决?

(对不起,如果这是一个微不足道的问题,这些是我在可可的第一步......)

编辑:

这是在 OS X Lion 10.7.1、Xcode 4.1 上。

编辑 2:

我找到了“修复”此问题的方法...在主窗口(或任何窗口)XIB/NIB 文件中,单击“属性检查器”,然后取消选中“可恢复”框。现在应用程序将不会存储最后一个位置,因此initialFirstResponder 看到将被尊重并相应地遵循。

【问题讨论】:

【参考方案1】:

欢迎来到可可! :) 我怀疑这是作为 OS X Lion 中新的user interface preservation 功能的一部分发生的。 (事实上​​,我刚刚创建了一个带有 3 个文本字段的简单应用程序,我也看到了这种行为。)因为windows automatically restore themselves,即使你没有实现它,你也会看到很多这种行为自动发生。这可能是可取的——大多数应用程序都会以这种方式工作,并且用户会期待它。

但是,如果您真的想要禁用它,您可以通过继承 NSWindow 或 NSTextField 并覆盖 -encodeRestorableStateWithCoder: 来实现。但是,我绝对建议您不要使用默认行为。


使用更多信息进行编辑:应用状态似乎存储在~/Library/Saved Application State/com.yourapp.savedState 中。在那里你可以看到一个 plist 文件,其中包含有关 windows 的信息。其他文件似乎不易阅读,但它们可能包含有关哪个字段是第一响应者等的信息。

【讨论】:

好的,有道理。感谢您的解释,因为我正在疯狂寻找错别字等...所以这不是错误,而是一个功能:) 只是一个更新,我想我找到了一种方法来强制执行这种行为......在属性检查器中有一个可恢复的复选框。取消它似乎是诀窍......【参考方案2】:

尽管这个帖子已经快 10 年了,但我会添加一个答案。就在 jbandes OS X 10.7 Lion 的回答推出大约一个月后。

以下来自NSWindowRestoration.h的报价

@interface NSWindow (NSUserInterfaceRestoration)

/* Determines whether the window should be restored on relaunch.  By default, windows with NSTitledWindowMask set in the styleMask are restorable, and windows without it set are not.
 */
@property (getter=isRestorable) BOOL restorable API_AVAILABLE(macos(10.7));

【讨论】:

以上是关于为啥设置 initialFirstResponder 没有效果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥要设置原型构造函数?

为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?

为啥没有设置变量

为啥没有加载持久的用户设置?

为啥不总是设置框架宽度/高度?