逛奔的蜗牛

我不聪明,但我会很努力

   ::  :: 新随笔 ::  ::  :: 管理 ::

在创建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类得到是否退出消息的控制函数。其返回值为:NSTerminateNowNSTerminateCancelNSTerminateLater。前两个顾名思义,就是立刻退出和取消推出。最后一个则被用来使用回调/选择函数处理后再用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/
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted on 2011-12-09 03:05 逛奔的蜗牛 阅读(663) 评论(0)  编辑 收藏 引用 所属分类: Cocoa

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理