前言
一般来说,用户会通电点击 x 按钮来关闭
- 但有些场景,比如登录页需要在登录成功时关闭,这是应该怎么办呢?
解决
网上一般会说这种方案:(不建议使用)
代码语言:javascript复制class BaseWindowController: NSWindowController {
...
@objc func terminateWindow(notification: NSNotification) {
...
NSApp.terminate(self)
}
...
}
- 使用 NSApp.terminate(self) 确实吧当前 WIndowController 关了,但是把其他的 WindowController 也关了
- 用户登录成功 app 直接退出?不太合适。所以我有开始了探索
NSWindowController :: close()
我阅读了下 WindowController 的借口,发现其中有一个 close 方法,我们稍加替换,吧 NSApp 换成我们的 WindowController 本身看看效果
代码语言:javascript复制class BaseWindowController: NSWindowController {
...
@objc func terminateWindow(notification: NSNotification) {
...
close()
}
...
}
- 完美关闭登陆页~ 且其他页面照常运行~ 但这个的方法,前提是得获得当前 WIndowController 实例,所以得在单例中、ViewController 中或者做全局的 WindowController 管理?太麻烦了
- 而且这个方法毕竟不是官方推荐的,就像手动调用 ViewController 的 layoutSubViews 一样,感觉不稳,所以我要找个稳妥的方法给大家
推荐 NSView :: window :: close
有没有一个办法,能直接在 view 上,把它的 WindowController 关了呢?我帮他家搜寻了一番,终于找到了正解
代码语言:javascript复制extension LoginViewController {
@objc func onSucceed(notification: NSNotification) {
...
NSView().window?.close()
...
}
@objc func onFailed(notification: NSNotification) {
/// TODO:
}
}
- 直接对当前 View 所在 window 执行 close 方法就可以啦,系统会帮我们进行后续的操作
- 注意这里要分 NSWindowControoler、NSViewController 和 NSView ,具体在使用分别帮大家总结一个吧
总结
- 帮大家总结一下
- NSWindowController :: 我们直接使用 self.window.close() 就可以啦
- NSViewController :: 我们需要通过 self.view.window.close() 来关闭
- NSView :: 我们直接使用 self.window.close() 就可以啦