AppKit(二):NSApplicationDelegate协议

NSApplicationDelegate协议

一个管理APP生命周期及其与公共系统服务交互的方法集合。

可这说是集合,简直就是一个方法海!咱们往下看......

声明

objectivec 复制代码
protocol NSApplicationDelegate : NSObjectProtocol

主题

加载application相关的

func applicationWillFinishLaunching(Notification)

通知代理application将要初始化完成

声明
swift 复制代码
@MainActor optional func applicationWillFinishLaunching(_ notification: Notification)
参数

notification

名为willFinishLaunchingNotification的通知。调用这个通知的对象方法,返回NSApplication本身。


再说一下willFinishLaunchingNotification通知, finishLaunching()方法开始前发送该通知,来表明APP完成初始化,并即将完成加载。
class let willFinishLaunchingNotification: NSNotification.Name 通知的对象是NSApp.该通知不包含在userInfo字典中。

引用于

Supporting Continuity Camera in Your Mac App


func applicationDidFinishLaunching(Notification)

通知代理APP初始化完成,但是还没有收到第一个事件。

参数

notification

名为didFinishLaunchingNotification的通知。调用这个通知的对象方法,返回NSApplication本身。

详情

通知对象是单例。参阅NSApplicationDidFinishLaunching User Keys,了解userInfo的键与值。不用参阅,其实就在下边。


NSApplicationDidFinishLaunching User Keys

在APP初始化阶段,系统传递给APP的,用来访问加载选项字典中值的键。

键名

class let launchIsDefaultUserInfoKey: String

该键的值是包含布尔值的NSNumber.如果APP启动来打开或者打印文件、执行Service操作、如果APP有将会恢复的保存状态、或者APP不是在默认情况下启动的,该值是false。其他情况下,值为true。

声明
kotlin 复制代码
class let launchIsDefaultUserInfoKey: String

class let launchUserNotificationUserInfoKey: String

表明用户从通知中心激活通知启动APP的键。

声明
kotlin 复制代码
class let launchUserNotificationUserInfoKey: String
详情

如果APP是因为用户激活通知中心的通知而启动,launchUserNotificationUserInfoKey键是一个存在于didFinishLaunchingNotification通知的userInfo字典中的NSUserNotification对象.访问userInfo中的此对象,你可以用如下方式:

objectivec 复制代码
NSUserNotification *userNotification = [[myNotification userInfo]
    objectForKey:NSApplicationLaunchUserNotificationKey];
    if (userNotification) {
        // The app was launched by a user selection from Notification Center.
    }

管理活跃状态相关的

func applicationWillBecomeActive(Notification)

通知代理,APP差不多要进入活跃状态了。

声明
swift 复制代码
@MainActor optional func applicationWillBecomeActive(_ notification: Notification)
参数

notification 名为willBecomeActiveNotification的通知。调用通知的对象方法,返回NSApplication对象本身。


func applicationDidBecomeActive(Notification)

通知代理,APP已经进入活跃状态。

声明
swift 复制代码
@MainActor optional func applicationDidBecomeActive(_ notification: Notification)
参数

notification

名为didBecomeActiveNotification的通知。调用通知的对象方法,返回NSApplication对象本身。


func applicationWillResignActive(Notification)

通知代理,APP将要成为不活跃状态,并且要失去焦点了。

声明
swift 复制代码
@MainActor optional func applicationWillResignActive(_ notification: Notification)
参数

名为willResignActiveNotification的通知,调用通知的对象方法,返回NSApplication对象本身。


func applicationDidResignActive(Notification)

通知代理,APP不再活跃,也没有了焦点。

声明
swift 复制代码
@MainActor optional func applicationDidResignActive(_ notification: Notification)
参数

notification 名为didResignActiveNotification的通知,调用通知的对象方法,返回NSApplication对象本身。

终止程序相关的

func applicationShouldTerminate(NSApplication) -> NSApplication.TerminateReply

返回一个表示是否应该终止APP的值。

声明
swift 复制代码
@MainActor optional func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply
参数

sender

即将被终止的那个application对象

返回值

一个表明application是否应该被终止的NSApplication.TerminateReply枚举常量。出于兼容性的考虑,false等于NSApplication.TerminateReply.terminateCanceltrue等于NSApplication.TerminateReply.terminationNow.

详情

程序的退出Quit菜单选项点击之后,或者调用terminate(_:)之后,会调用这个方法。一般情况下,应该返回NSApplication.TerminateReply.terminateNow,来完成终止操作,但是你也可以取消终止操作,或者根据需要推迟终止操作。例如,你可能需要在程序终止之前完成关键数据的处理,但是当你完成所需操作之后,需要立即调用reply(toApplicationShouldTerminate:)方法。

enum TerminateReply

决定是否应该终止APP的枚举常量。
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>case terminateNow
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>完成终止操作。
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>case terminateCancel
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>取消终止操作。
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>case terminateLater
<math xmlns="http://www.w3.org/1998/Math/MathML"> \qquad </math>延迟终止操作。返回这个值会导致Cocoa将run loop运行NSModalPanelRunLoopMode中,直到APP调用reply(toApplicationShouldTerminate:),参数为truefalse。此返回值用于需要显示modal alert(sheet)来决定是否退出的代理。

初始化器

init?(rawValue: UInt)


func applicationShouldTerminateAfterLastWindowClosed(NSApplication) -> Bool

返回一个布尔值,该值表明是否最后一个窗口一旦关闭,程序就会终止。

声明
swift 复制代码
@MainActor optional func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool
参数

sender

最后一个窗口被关闭的application对象。

返回值

如果最后一个窗口关闭时不终止程序,返回false;否则返回true

详情

程序最后一个窗口关闭时,程序会发送这个消息给你的代理,不管是否有panel仍然处于打开状态,都会发送这个消息(这里的panel定义为一个NSPanel对象,或者是其子类)。

如果返回false,控制会回到主循环并且程序不会终止。如果返回true,随后会调用代理的applicationShouldTerminate(_:)方法来确认应该终止程序。


func applicationWillTerminate(Notification)

通知代理,APP即将终止。

声明
swift 复制代码
@MainActor optional func applicationWillTerminate(_ notification: Notification)
参数

notification

名为willTerminateNotification的通知,调用通知的对象方法,返回NSApplication对象本身。

详情

你的代理可以使用该方法来确认程序终止前的最终清理工作。该方法返回后,程序将被终止。

备注:

程序突然退出,不会调用这个方法。了解更多关于程序突然退出的信息,参见ProcessInfo

相关推荐
anyup_前端梦工厂9 分钟前
React 单一职责原则:优化组件设计与提高可维护性
前端·javascript·react.js
天天扭码36 分钟前
面试官:算法题”除自身以外数组的乘积“ 我:😄 面试官:不能用除法 我:😓
前端·算法·面试
小小小小宇39 分钟前
十万字JS不良实践总结(逼疯审核版)
前端
喝拿铁写前端42 分钟前
从列表页到规则引擎:一个组件封装过程中的前端认知进阶
前端·vue.js·架构
小小小小宇1 小时前
React Lanes(泳道)机制
前端
zhangxingchao1 小时前
Jetpack Compose 之 Modifier(上)
前端
龙萌酱1 小时前
力扣每日打卡17 49. 字母异位词分组 (中等)
前端·javascript·算法·leetcode
工呈士1 小时前
HTML与Web性能优化
前端·html
秃了才能变得更强1 小时前
React Native 原生模块集成Turbo Modules
前端
旺旺大力包2 小时前
【 React 】重点知识总结 && 快速上手指南
开发语言·前端·react.js