viewWillDisappear 使用 Cmd+W 调用,但从未使用 Cmd+Q for Mac App 使用 Swift 制作
Posted
技术标签:
【中文标题】viewWillDisappear 使用 Cmd+W 调用,但从未使用 Cmd+Q for Mac App 使用 Swift 制作【英文标题】:viewWillDisappear gets called with Cmd+W but never with Cmd+Q for Mac App made in Swift 【发布时间】:2015-06-30 10:07:55 【问题描述】:我正在 Xcode 上使用 Swift(使用情节提要)构建一个简单的单窗口应用程序,我在其中显示来自 BLE 设备的数据。 BLE 设备通过应用程序获得打开某些传感器的命令,并且可以使用应用程序查看数据。退出时,我需要应用程序要求 BLE 设备关闭传感器。
为此,我在 ViewController.swift 中重载了 viewWillDisappear 函数,并在那里执行了所需的 BLE 命令。我可以看到,如果我关闭窗口,我的 BLE 设备会关闭其传感器并进入睡眠状态。
但是,当我从菜单中简单地按 Cmd+Q 或“退出”时,应用程序退出而不执行 viewWillDisappear 功能! Cmd+Q 应该是一个不优雅的退出吗?
如何确保在 Cmd+Q 上也调用“viewWillDisappear”函数?或者,为了同样的目的,我是否需要重载其他一些函数?
感谢和问候, 阿努普
【问题讨论】:
这可能是突然终止的一部分:developer.apple.com/library/mac/documentation/Cocoa/Reference/…。尝试将 NSSupportsSuddenTermination = NO 添加到您的 Info.plist 嗨@PierreBernard,不幸的是,Info.plist 不允许我将其添加到其中,但我正在尝试找出一种将 disableSuddenTermination 添加到 ViewController.swift 的方法。我会及时通知你。 【参考方案1】:解决方法的建议:
定义一个变量
var sensorsAreON = false
在开启传感器的功能中添加
sensorsAreON = true
定义一个函数switchSensorsOFF()
,如果传感器仍然打开,则将其关闭。在viewWillDisappear()
和applicationWillTerminate()
中调用这个函数
func applicationWillTerminate(notification: NSNotification)
switchSensorsOFF()
// do other stuff
func viewWillDisappear()
switchSensorsOFF()
// do other stuff
func switchSensorsOFF()
if sensorsAreON
performTheRealFunctionToSwitchSensorsOff()
sensorsAreON = false
如果你想在窗口关闭时终止应用,实现 NSApplication 委托方法applicationShouldTerminateAfterLastWindowClosed
并返回true
。然后你可以把你所有的清理代码放到applicationWillTerminate
而不是viewWillDisappear
【讨论】:
非常感谢您的快速帮助!我已经在 ViewController.swift 中实现了 viewWillDisappear 并验证了它是否符合我的要求。您对 applicationShouldTerminateAfterLastWindowClosed 的建议也是一个非常好的提示。但是,如何从 AppDelegate.swift 引用 ViewController.swift 中包含的函数?似乎不再有 self.window.etc 等(就像在 Objective-C 中一样)!以上是关于viewWillDisappear 使用 Cmd+W 调用,但从未使用 Cmd+Q for Mac App 使用 Swift 制作的主要内容,如果未能解决你的问题,请参考以下文章
动画 viewWillAppear 和 viewWillDisappear?
重写viewWillAppear 和 viewWillDisAppear时[super viewWillAppear] 和 [super viewWillDisappear]的调用位置
viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 指南
在 viewWillDisappear 上停止 AVAudioPlayer