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。
相关产品推荐
相关产品推荐

