用NSBeginAlertSheet做代理控制应用程序是否退出

    在创建 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取消退出。

原文地址:https://www.cnblogs.com/watchdatalearn2012620/p/3089205.html