为什么设置initialFirstResponder没有效果?

时间:2011-08-23 07:56:49

标签: cocoa user-interface first-responder

我有一个包含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视觉将得到尊重并相应地遵循。

2 个答案:

答案 0 :(得分:7)

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

但是,如果确实想要禁用它,您可以通过继承NSWindow或NSTextField并覆盖-encodeRestorableStateWithCoder:来实现。但是,我绝对建议你单独保留默认行为。


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

答案 1 :(得分: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));