zoukankan      html  css  js  c++  java
  • 用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取消退出。

  • 相关阅读:
    491 · 回文数
    936 · 首字母大写
    1343 · 两字符串和
    1535 · 转换成小写字母
    13 · 字符串查找
    146 · 大小写转换 II
    241 · 转换字符串到整数(容易版)
    46 · 主元素
    kotlin协程——>通道
    kotlin协程——>异步流
  • 原文地址:https://www.cnblogs.com/watchdatalearn2012620/p/3089205.html
Copyright © 2011-2022 走看看