Cocoa 如何防止Lion显示崩溃后是否要恢复windows
每次崩溃后,当我启动应用程序时,lion都会询问我是否希望它还原应用程序窗口,因为上次它没有正确终止,我如何禁用它 背景:我正在为Lion(和Snow Leopard)开发一个可可应用程序,它是一个科学应用程序(不是消费者应用程序,只在内部使用,不在外部分发)。Cocoa 如何防止Lion显示崩溃后是否要恢复windows,cocoa,crash,osx-lion,restore,Cocoa,Crash,Osx Lion,Restore,每次崩溃后,当我启动应用程序时,lion都会询问我是否希望它还原应用程序窗口,因为上次它没有正确终止,我如何禁用它 背景:我正在为Lion(和Snow Leopard)开发一个可可应用程序,它是一个科学应用程序(不是消费者应用程序,只在内部使用,不在外部分发)。 它与几个硬件接口,并且经常崩溃!(我知道我应该让它不崩溃,但有很多遗留的C代码,没有很好的驱动程序和……) 问题:在每次崩溃后,当我启动应用程序lion时,lion会询问我是否希望它还原应用程序窗口,我如何禁用它 这似乎可行,但没有任何
它与几个硬件接口,并且经常崩溃!(我知道我应该让它不崩溃,但有很多遗留的C代码,没有很好的驱动程序和……)
问题:在每次崩溃后,当我启动应用程序lion时,lion会询问我是否希望它还原应用程序窗口,我如何禁用它 这似乎可行,但没有任何文档记录,因此在未来的操作系统更新中可能不起作用:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ApplePersistenceIgnoreState"];
您可以将
NSApplication
子类化,并实现restorewindowwhidentifier:state:completionHandler:
(另请参见;与NSWindows上的同级方法不同,此方法返回BOOL)。例如,将属性preventWindowRestoration
添加到NSApplication子类中,以便执行以下操作:
- (BOOL)restoreWindowWithIdentifier:(NSString *)identifier state:(NSCoder *)state completionHandler:(void (^)(NSWindow *, NSError *))completionHandler
{
if ([self preventWindowRestoration]) return NO;
return [super restoreWindowWithIdentifier:identifier state:state completionHandler:completionHandler];
}
您最迟需要在
applicationWillFinishLaunching:
中设置属性,因为还原发生在applicationWillFinishLaunching:
和ApplicationIDFinishLaunching:
之间。别忘了在Info.plist中将您的NSApplication子类指定为principal类。上述答案对我都不起作用(我没有尝试默认的关键技巧,但它似乎不适合生产使用)。以下是对我有效的方法:
在Xcode中,打开故事板的窗口xib并选择NSE窗口
显示实用程序面板(右侧弹出窗口),选择属性检查器(看起来像一个滑动旋钮),然后取消选中“[]可恢复”和“[]启动时可见”
可以为您创建的窗口设置可恢复属性:
NSWindow* window = ...
window.restorable = NO;
我找不到设置window.visible属性的最佳时间,但在xib中设置它对我来说很有用。来自“忽略现有的可恢复状态(自2011年初以来新增)定义用户默认的ApplePersistenceIgonRepreat时,将忽略现有的可恢复状态和无标题文档。新的可恢复状态和无标题文档自动保存将重定向到临时目录,其路径将记录到控制台。此用户默认值用于希望从干净的环境开始的自动测试“
-restorewindowwhidentifier:…
在Yosemite中并不总是被调用,因此它不能可靠地用于防止恢复。