iOS 11.3:从父ViewController触发ContainerViewController的performSegue无效
解决ContainerView中performSegue不触发的问题
我来帮你排查下这个performSegue()没触发的常见原因,以及对应的解决办法:
一、检查Segue的基础配置
- 首先确认Storyboard里的segueIdentifier完全正确,代码里调用
performSegue(withIdentifier: "你的SegueID", sender: self)时,ID的大小写、拼写必须和Storyboard里的设置完全一致,哪怕一个字符错了都不行。 - 还要注意segue的起点:你的segue是属于
ContainerViewController的,所以必须是从ContainerViewController(而不是父ViewController)出发,分别连接到Screen1ViewController和Screen2ViewController,很多人会误把segue连到父VC上,这肯定触发不了。
二、确保调用performSegue的对象是正确的VC
你在父ViewController里直接调用performSegue(),默认触发的是父VC身上的segue,但你的目标segue在ContainerViewController里。所以得先拿到container对应的VC实例,再调用它的performSegue方法:
// 在父ViewController中获取ContainerViewController实例 if let containerVC = self.children.first(where: { $0 is ContainerViewController }) as? ContainerViewController { // 替换成你自己的Segue标识符 containerVC.performSegue(withIdentifier: "SegueToScreen1", sender: self) }
三、检查是否有拦截segue的代码
如果ContainerViewController或者父VC里重写了shouldPerformSegue(withIdentifier:sender:)方法,并且返回了false,那segue就会被拦截。检查下有没有类似代码:
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { // 这里如果返回false,segue就不会执行 return true // 确保返回true,或者根据业务逻辑正确返回 }
四、确认ContainerViewController已正常加载
如果ContainerViewController还没被正确初始化并添加到父VC的containerView中,调用它的performSegue肯定无效。可以在ContainerViewController的viewDidLoad里加个打印语句,确认它已经正常启动:
override func viewDidLoad() { super.viewDidLoad() print("ContainerViewController已加载") }
五、手动切换子VC的替代方案
如果segue的方式始终有问题,也可以放弃segue,手动实现container里的子VC切换,这种方式更可控:
// 在ContainerViewController中添加切换方法 func switchToTargetVC(_ identifier: String) { guard let targetVC = storyboard?.instantiateViewController(withIdentifier: identifier) else { return } // 移除当前所有子VC children.forEach { childVC in childVC.willMove(toParent: nil) childVC.view.removeFromSuperview() childVC.removeFromParent() } // 添加新的子VC addChild(targetVC) targetVC.view.frame = view.bounds view.addSubview(targetVC.view) targetVC.didMove(toParent: self) } // 在父ViewController中调用 if let containerVC = self.children.first(where: { $0 is ContainerViewController }) as? ContainerViewController { // 传入Screen1ViewController的Storyboard标识符 containerVC.switchToTargetVC("Screen1ViewController") }
内容的提问来源于stack exchange,提问作者sooon
相关产品推荐
相关产品推荐

