在創(chuàng)建Cocoa應用程序的時候,有時候我們需要在應用程序退出前讓用戶確認是否真正退出。這個可以用多種方法來實現(xiàn)。但是如果利用AlertSheet的話可以盡量使得過程更舒服。如下圖。
我們可以利用xcode里面已經(jīng)為你創(chuàng)建好的Application的代理類來調(diào)用NSBeginAlertSheer來做做代理處理請求。接下來我們來看看具體的做法。
在Interface Builder里面從Application按下Control拉一條線到已經(jīng)有的代理類上面,連接delegate的outlet。如下圖:

然后轉(zhuǎn)向代理類的代碼中加入如下代碼:
- (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類得到是否退出消息的控制函數(shù)。其返回值為:NSTerminateNow, NSTerminateCancel和NSTerminateLater。前兩個顧名思義,就是立刻退出和取消推出。最后一個則被用來使用回調(diào)/選擇函數(shù)處理后再用replyToApplicationShouldTerminate來決定程序是否退出。
下面就是如何用NSBeginAlertSheet來接受用戶選擇以決定程序是否退出。其函數(shù)原型定義如下:
void NSBeginCriticalAlertSheet (
NSString *title, //標題
NSString *defaultButton, //默認按鈕
NSString *alternateButton, //第二按鈕
NSString *otherButton, //其他按鈕
NSWindow *docWindow, //用于attach該sheet的窗體
id modalDelegate, //modal代理
SEL didEndSelector, //Selector結(jié)束時(sheet消失前)調(diào)用的modalDelegate中的函數(shù)
SEL didDismissSelector, //Selector結(jié)束時(sheet消失前)調(diào)用的modalDelegate中的函數(shù)
void *contextInfo, //傳給didEnd和didDismiss的額外數(shù)據(jù)
NSString *msg, //sheet的提示內(nèi)容
...
);
我們把當前的類作為modalDelegate。然后用其中的sheetClosed函數(shù)來作為didEnd的回調(diào)函數(shù)。最后在applicationShouldTerminate最后返回NSTerminateLater來等待做進一步的處理。
在我們的實際判斷過程中。通過判斷用戶按下的是否是NSAlertDefaultReturn來判斷用戶選擇的按鈕。如果是默認的退出按鈕,則給replyToApplicationShouldTerminate傳YES以立刻退出,否則傳NO取消退出。
From: http://yeeyaa.me/articles/2011/03/confirm-application-quit-using-nsbeginalertsheet-as-delegate/