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

iOS开发:关闭子控制器B的视图后如何刷新父控制器A的界面

问题原因

你这种添加子控制器的方式属于将BViewController的view作为子视图加到A的view层级中,A本身一直处于可见状态,所以移除B的view时自然不会触发A的viewWillAppear回调。另外你现有的关闭子视图的方法少了子控制器的移除步骤,会有内存泄漏风险。

注意你贴的代码第一行有笔误:赋值给self.AView但后续操作的是self.BView,记得修正避免运行崩溃。

可行解决方案

方案1:使用闭包回调(最推荐)

在BViewController中定义关闭回调:

// BViewController.swift 中定义
var onClose: (() -> Void)?

修改B的关闭方法:

func closeCurrentView(){
    self.view.removeFromSuperview()
    self.removeFromParent() // 补上子控制器移除逻辑,避免内存泄漏
    onClose?() // 触发回调
}

在A中添加B的时候绑定回调:

self.BView = (self.storyboard!.instantiateViewController(withIdentifier: "BView") as? BViewController)!
self.addChild(self.BView)
// 绑定回调
self.BView.onClose = { [weak self] in
    guard let self = self else { return }
    // 在这里写你原本要放在viewWillAppear里的刷新逻辑即可
    self.reloadAViewData()
}
self.BView.view.frame = CGRect(x: 0, y: self.view.frame.height - 450, width: self.view.frame.width , height: 450)
self.view.addSubview(self.BView.view)
self.view.bringSubviewToFront(self.BView.view)
// 记得调用didMove方法完成子控制器添加流程
self.BView.didMove(toParent: self)

方案2:使用NotificationCenter通知

在A的viewDidLoad中添加监听:

NotificationCenter.default.addObserver(self, selector: #selector(reloadAViewData), name: NSNotification.Name("BViewClosed"), object: nil)

修改B的关闭方法:

func closeCurrentView(){
    self.view.removeFromSuperview()
    self.removeFromParent()
    NotificationCenter.default.post(name: NSNotification.Name("BViewClosed"), object: nil)
}

在A中实现reloadAViewData方法写你的刷新逻辑即可,记得A销毁时移除通知监听。

方案3:直接在B的关闭方法中调用父控制器方法

如果不想用回调和通知,也可以在B中直接获取父控制器调用刷新:

func closeCurrentView(){
    self.view.removeFromSuperview()
    if let parentVC = self.parent as? AViewController {
        parentVC.reloadAViewData()
    }
    self.removeFromParent()
}

内容的提问来源于stack exchange,提问作者Crist。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:36:03