为什么设置 initialFirstResponder 没有效果?

问题描述 投票:7回答:2

我有一个简单的表单(NSWindow),有3个文本字段。NSWindow的 initialFirstResponder 是 "指向 "第一个字段(NSTextField). 所有三个文本字段都通过以下方式相互循环链接 nextKeyView.

我的问题是,当我从Xcode启动应用程序时,它将关注应用程序关闭时最后激活的文本字段(处于焦点)。

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

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

(对不起,如果这是一个琐碎的问题,这是我第一次接触可可...)

EDIT.这是在OS X Lion 10.0上。

这是在OS X Lion 10.7.1,Xcode 4.1。

EDIT 2.我找到了一个 "修复 "的方法,就是在OS X Lion 10.7.1,Xcode 4.1上。

我找到了一个 "解决 "这个问题的方法... ... 在主窗口(或任何窗口)XIBNIB文件中,点击 "属性检查器",然后取消选中 "可恢复 "框。现在,应用程序将不会存储最后的位置,所以在XIBNIB文件中的 initialFirstResponder 看到的将会被尊重并相应地遵循。

cocoa user-interface first-responder
2个回答
7
投票

欢迎来到Cocoa! :) 我怀疑这是发生在新的 用户界面保存 的功能。事实上,我刚刚创建了一个有3个文本字段的简单应用,也看到了这种行为)。因为 窗口自动恢复即使你没有实现,你也会看到很多这种行为自动发生。这可能是可取的--大多数应用程序都会以这种方式工作,而且用户也会期待这种方式。

然而,如果你 真的 想要禁用它,你可以通过子类NSWindow或者NSTextField,然后重写 -encodeRestorableStateWithCoder:. 但是,我绝对建议你不要使用默认行为。


编辑有一点进一步的信息:应用程序的状态似乎被存储在 ~/Library/Saved Application State/com.yourapp.savedState. 在那里你可以看到一个plist文件,里面有关于窗口的信息。其他文件似乎不容易读懂,但它们可能包含了哪个字段是第一响应者等信息。


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));
© www.soinside.com 2019 - 2024. All rights reserved.