gpt4 book ai didi

cocoa - 如何实现自定义NSApplication终止: behavior in Cocoa?

转载 作者:行者123 更新时间:2023-12-03 16:20:01 27 4
gpt4 key购买 nike

我正在尝试在 Cocoa 应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终运行时数据库清理,然后退出。每当调用 [NSApp Terminate:aSender] 时,都会在 AppDelegate(NSApplication 的委托(delegate))内部发生这种情况:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
// database cleanup...
return NSTerminateNow;
}

如果在运行时发生错误(例如数据库文件被删除),我会向用户显示错误,并为他们提供恢复(将文件放回并重试)或退出的选项。如果选择“退出”,我想退出应用程序并完全跳过数据库清理,因为它不再可能了。本质上,我想要这样的东西:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
BOOL gracefulTermination = ...;

if (gracefulTermination == YES)
{
// Database cleanup....
}

return NSTerminateNow;
}

当然,问题是获取gracefulTermination的值。

有没有办法在调用 terminate: 时将自定义变量传递给 NSApp,例如 infoDict,然后在 applicationShouldTerminate:< 中接收它

如果没有,是否有更好的方法来完成自定义终止行为?

<小时/>

据我所知,当terminate:被其他对象调用时,会发生这种情况:

  1. [NSApp Terminate:self];foo(又名 self)调用。
  2. NSApp 发送其委托(delegate):[aDelegate applicationShouldTerminate:self];(self 是 NSApp,而不是 foo)。
  3. aDelegate 接收消息并执行 applicationShouldTerminate:(如果已实现)。

foo 似乎消失在某处,当 aDelegate 收到消息时,它就永远消失了,只有 NSApp 显示为发送者。这阻止我将 foo 内部的 infoDict 或只是一个普通的 infoDict 传递给包含自定义 terminate: 行为的Delegate。

<小时/>

我知道不使用 [NSApp Terminate:...]exit() 之类的东西就可以退出。尽管从我读到的内容来看,这是不受欢迎的,因为这对 cocoa 来说不符合犹太教规。另外,它还可以防止在 applicationShouldTerminate: 内部发生任何其他清理操作,即使在非正常退出期间也不应跳过这些操作。

最佳答案

理想的解决方案是以应用程序委托(delegate)可以判断是否允许终止的方式构建应用程序。

假设您的应用程序委托(delegate)不可能以任何其他方式访问此信息(例如,哪个对象触发终止会影响它是否会发生),这似乎是最简单的解决方案:子类 NSApplication,给它一个 TerminationInfo 属性并覆盖 terminate: 以设置此属性并调用 super。

关于cocoa - 如何实现自定义NSApplication终止: behavior in Cocoa?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com