OS X Swift中NSViewController跳转时如何关闭前一个视图控制器
实现方案
方案1:使用闭包回调(推荐,低耦合)
步骤1:在B控制器(RegisterViewController)中定义回调属性
在B的类定义顶部添加:
var dismissHandler: (() -> Void)?
步骤2:修改A中跳转B的代码,给回调赋值
let vc = RegisterViewController.registerViewController() vc.title = "Sign up" vc.dismissHandler = { [weak self] in // 关闭A所在的窗口 self?.view.window?.close() } self.presentViewControllerAsModalWindow(vc)
步骤3:B中跳转C的同时触发回调
在B需要跳转C的逻辑处添加如下代码:
// 触发回调关闭A dismissHandler?() // 关闭当前B的模态窗口 self.dismiss(self) // 展示C控制器,可根据需求调整展示方式 let vcC = CViewController() // 示例:在当前活跃窗口模态展示C NSApplication.shared.keyWindow?.contentViewController?.presentViewControllerAsModalWindow(vcC)
方案2:使用通知中心实现
如果多层嵌套不方便传递闭包,可使用通知方案:
步骤1:A中监听关闭通知
在A的viewDidLoad方法中添加监听:
NotificationCenter.default.addObserver(self, selector: #selector(closeWindow), name: NSNotification.Name("CloseVCANotification"), object: nil)
实现关闭方法:
@objc private func closeWindow() { view.window?.close() }
步骤2:B中跳转C时发送通知
在B的跳转逻辑处添加代码:
// 发送通知关闭A NotificationCenter.default.post(name: NSNotification.Name("CloseVCANotification"), object: nil) // 关闭当前B self.dismiss(self) // 展示C,逻辑同方案1 let vcC = CViewController() NSApplication.shared.keyWindow?.contentViewController?.presentViewControllerAsModalWindow(vcC)
注意事项
- 闭包必须加
[weak self]避免循环引用 - 如果A是App主窗口的根控制器,关闭A后要确保C的窗口被正常持有,避免被系统释放
内容的提问来源于stack exchange,提问作者Zulqarnain Naveed
相关产品推荐
相关产品推荐

