- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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:
被其他对象调用时,会发生这种情况:
[NSApp Terminate:self];
由 foo(又名 self)调用。[aDelegate applicationShouldTerminate:self];
(self 是 NSApp,而不是 foo)。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/
我遇到了一个奇怪的问题,我点击离开窗口。它放弃了主要和关键。然后我单击返回它,并且单击的 View 不响应鼠标单击。但第二次单击确实会导致 View 做出响应。就好像在第一次单击期间,窗口不是关键,而
我想知道是否允许使用 runModalForWindow() 启动多个模式循环。在我的应用程序中,我有以下设置:当用户在非模态窗口 A 中按下按钮 A 时,将使用 runModalForWindow(
您好,我是 cocoa 框架的新手,因此需要帮助来更好地理解该框架。 我当前的重点领域是了解 NSApplication 默认创建的线程数以及控制或限制它的方法。也就是说,我看到创建了一个空窗口的基本
我的窗口中有一个 NSTextField 和 4 个具有等效键的菜单项 ←↑→↓. 当选择文本字段并按箭头键时,我希望光标在文本字段中移动,但会执行相应的菜单项操作。 所以响应者链中肯定存在问题。为了
当我的窗口加载时,我遇到了崩溃(下面的回溯)。这似乎表明核心动画正在发生一些事情,但我没有启动任何动画,只是显示窗口。 将特定堆栈 View 的剪切阻力从 1000 更改为 750 可以暂时避免崩溃,
我有一个应用程序,其中的 main.m 返回 NSApplicationMain(argc, (const char **) argv);。 我想在 -applicationDidFinishLaun
UIApplication 和 NSApplication 有什么区别? (因为我没有从他们的文档中得到它...) 有人可以给我一些有用的链接来详细解释它们之间的区别吗? 另外,AppNameAppD
我创建了 NSApplication 子类: class MyApplication: NSApplication { override func sendEvent(theEvent: NS
这可能吗,就像当您调用“hide:”时它会调用“applicationWillHide:”? 我的应用程序使用可变数量的窗口,具体取决于可用屏幕的数量,因此当调用“miniaturizeAll:”时,
我有一个由以下单个 .m 文件组成的应用程序: #import int main(int argc, char* argv[]) { [[[NSThread alloc] initWithBlo
我需要在 MonoMac 中继承 NSApplication 来重写 NSApplication 的 sendEvent(C# 术语中的 SendEvent)方法,以便接收媒体键事件(Macbook
我已经搜索了很长一段时间,但根本找不到任何东西,我已经有了可以创建的窗口,但现在当我尝试调用 makeKeyAndOrderFront 时,没有应用程序可以调用它,所以我想知道是否有人可以给出一个关于
我遇到了无法访问应用程序主窗口的问题,因为它返回 nil。 let window = NSApplication.sharedApplication().mainWindow 我发现了类似的问题: H
好吧,这真的难倒我了: 我在窗口上创建了一个模态表 -(IBAction) login: (id) sender { [NSApp beginSheet:loginWindow modalFor
一个NSStatusItem应用程序,并将NSStatusItem的 View 设置为myView [statusItem setView:myView]; 这样 myView 可以显示在状态栏中,我
看来我无法从“系统偏好设置” Pane 中控制 NSApp 委托(delegate),这是可以理解的。当程序激活时,是否有其他方法可以通知我的对象? 最佳答案 Cocoa 框架中的大多数委托(dele
我试图将我的应用程序分成不同的子进程,每个子进程都做一件非常具体的事情。主要原因是稳定性和更好的内存利用率,因为我使用保守的垃圾收集器(boehm-weisser)。 我不想用一个庞大的过程来完成这一
我目前正在尝试编写我的第一个 CoreData-Application,它需要访问应用程序委托(delegate)来获取某些内容。因此,我试图在我的委托(delegate)中创建一个小变量,我想读取该
我来自 Cocoa touch 背景,有一点我被困住了,我试图从头开始创建一个 ViewController 并将我的 xib 中的对象连接到我的新 ViewController 中的操作。我将文件的
在我的 mac os x 应用程序中,我对 NSApplication 进行子类化并重写它的 -sendEvent: 方法。苹果提示: The app includes 'OBJC_IVAR_$_NS
我是一名优秀的程序员,十分优秀!