在创建Cocoa应用程序的时候,有时候我们需要在应用程序退出前让用户确认是否真正退出。这个可以用多种方法来实现。但是如果利用AlertSheet的话可以尽量使得过程更舒服。如下图。
我们可以利用xcode里面已经为你创建好的Application的代理类来调用NSBeginAlertSheer来做做代理处理请求。接下来我们来看看具体的做法。
在Interface Builder里面从Application按下Control拉一条线到已经有的代理类上面,连接delegate的outlet。如下图:
然后转向代理类的代码中加入如下代码:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
NSString *msg = @"Should this applicaion quit?";
SEL sel = @selector(sheetClosed:returnCode:contextInfo:);
NSBeginAlertSheet(@"Close",
@"OK",
@"Cancel",
nil,
window,
self,
sel,
NULL,
sender,
msg,
nil);
return NSTerminateLater;
}
- (void)sheetClosed:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
if (returnCode == NSAlertDefaultReturn)
{
[(NSApplication *)contextInfo replyToApplicationShouldTerminate:YES];
}
else
{
[(NSApplication *)contextInfo replyToApplicationShouldTerminate:NO];
}
}
其中:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
是Application类得到是否退出消息的控制函数。其返回值为:NSTerminateNow
, NSTerminateCancel
和NSTerminateLater
。前两个顾名思义,就是立刻退出和取消推出。最后一个则被用来使用回调/选择函数处理后再用replyToApplicationShouldTerminate
来决定程序是否退出。
下面就是如何用NSBeginAlertSheet
来接受用户选择以决定程序是否退出。其函数原型定义如下:
void NSBeginCriticalAlertSheet (
NSString *title, //标题
NSString *defaultButton, //默认按钮
NSString *alternateButton, //第二按钮
NSString *otherButton, //其他按钮
NSWindow *docWindow, //用于attach该sheet的窗体
id modalDelegate, //modal代理
SEL didEndSelector, //Selector结束时(sheet消失前)调用的modalDelegate中的函数
SEL didDismissSelector, //Selector结束时(sheet消失前)调用的modalDelegate中的函数
void *contextInfo, //传给didEnd和didDismiss的额外数据
NSString *msg, //sheet的提示内容
...
);
我们把当前的类作为modalDelegate
。然后用其中的sheetClosed
函数来作为didEnd的回调函数。最后在applicationShouldTerminate
最后返回NSTerminateLater
来等待做进一步的处理。
在我们的实际判断过程中。通过判断用户按下的是否是NSAlertDefaultReturn
来判断用户选择的按钮。如果是默认的退出按钮,则给replyToApplicationShouldTerminate
传YES以立刻退出,否则传NO取消退出。
From: http://yeeyaa.me/articles/2011/03/confirm-application-quit-using-nsbeginalertsheet-as-delegate/