7

我有一个带有 3 个文本字段的简单表单(NSWindow)。NSWindowinitialFirstResponder是“指向”第一个字段 ( NSTextField)。所有三个文本字段都通过 循环链接nextKeyView

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

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

为什么会这样,我将如何解决这个问题?

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

编辑:

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

编辑2:

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

4

2 回答 2

7

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

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


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

于 2011-08-23T08:08:03.387 回答
0

尽管这个线程已经快 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));
于 2020-04-25T14:00:13.270 回答