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

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触发这个方法,推荐用闭包(避免强引用):

  1. 在彩色VC里加个闭包属性:
var onClose: (() -> Void)?
  1. 彩色VC的关闭按钮点击时调用闭包:
@IBAction func closeBtnTapped(_ sender: UIButton) {
    onClose?()
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:11:05