Swift 4 无法移除popupViewController视图的问题求助
问题分析与解决办法
核心原因
你的彩色视图关闭按钮无效,根本问题是没理清楚ViewController的层级关系:
- ARSCNView所在的主VC是popupViewController的父VC,popupVC是通过
addChildViewController被添加为主VC子VC的 - 那些彩色视图(FirstViewController、MasterViewController)是popupVC的子VC/子View,当前显示层级在popupVC之上,直接调用关闭popupVC的方法自然没用
不用依次关闭所有VC,按以下步骤处理就行
第一步:先移除当前显示的彩色VC/View
如果彩色视图是popupVC的子ViewController(比如用push或addChildViewController添加的),在彩色VC的关闭按钮点击事件里写:
self.willMove(toParentViewController: nil) self.view.removeFromSuperview() self.removeFromParentViewController()
如果彩色视图只是popupVC的子View,直接隐藏或移除它:
// 隐藏彩色View colorView.isHidden = true // 或者直接移除 // colorView.removeFromSuperview()
第二步:调用popupVC的统一关闭方法
把popupVC的关闭逻辑封装成一个方法,和它自带的close按钮逻辑保持一致:
// 在popupViewController里定义统一关闭方法 func closePopup() { self.willMove(toParentViewController: nil) self.view.removeFromSuperview() self.removeFromParentViewController() }
然后让彩色VC触发这个方法,推荐用闭包(避免强引用):
- 在彩色VC里加个闭包属性:
var onClose: (() -> Void)?
- 彩色VC的关闭按钮点击时调用闭包:
@IBAction func closeBtnTapped(_ sender: UIButton) { onClose?() }
- popupVC跳转彩色VC时,绑定闭包:
// 假设你实例化彩色VC的代码 let colorVC = storyboard?.instantiateViewController(withIdentifier: "ColorVCID") as! ColorViewController colorVC.onClose = { [weak self] in self?.closePopup() } // 再把colorVC添加为popupVC的子VC或者push进去
注意事项
- 用
[weak self]避免循环引用,防止内存泄漏 - 所有关闭入口都调用popupVC的
closePopup方法,逻辑统一好维护
内容的提问来源于stack exchange,提问作者CodeChris
相关产品推荐
相关产品推荐

