You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 02:15:03