使用ContainerViewController切换ViewController时跨控制器调用Segue报错
解决ContainerViewController调用Segue报错的问题
问题出在你创建父控制器实例的方式上!当你用let vc = ParentViewController()直接初始化时,这个新对象完全没有关联你在Storyboard里配置的segue——因为Storyboard里的segue是属于那个在可视化界面中被配置的特定控制器实例的,而你手动new出来的实例根本不知道这些segue的存在,自然会报“找不到segue标识符”的错误。
下面给你两种针对性的解决方案:
方案1:获取已存在的父控制器实例(如果它已经在视图层级/导航栈中)
如果ParentViewController已经被加载到界面上(比如是当前导航栈里的控制器,或者是当前控制器的父容器),你需要找到它的现有实例,而不是新建一个:
场景A:父控制器在导航栈中
// 在触发按钮的ViewController中,查找导航栈里的ParentViewController实例 if let parentVC = self.navigationController?.viewControllers.first(where: { $0 is ParentViewController }) as? ParentViewController { parentVC.segueIdentifierReceivedFromParent("second") }
场景B:当前控制器是ParentViewController的子控制器
// 直接通过parent属性获取父容器实例 if let parentVC = self.parent as? ParentViewController { parentVC.segueIdentifierReceivedFromParent("second") }
方案2:从Storyboard初始化父控制器(如果它还没被加载)
如果ParentViewController还没被实例化,你必须从Storyboard中初始化它(这样才能带上Storyboard里配置的segue信息):
- 先给Storyboard里的ParentViewController设置一个Storyboard ID(在Identity Inspector里设置,比如设为"ParentVC")
- 用下面的代码初始化并调用方法:
let storyboard = UIStoryboard(name: "Main", bundle: nil) // 替换成你的Storyboard名字 guard let parentVC = storyboard.instantiateViewController(withIdentifier: "ParentVC") as? ParentViewController else { print("找不到对应的控制器实例") return } parentVC.segueIdentifierReceivedFromParent("second") // 之后把这个控制器push或者present到界面上 self.navigationController?.pushViewController(parentVC, animated: true)
总结一下:永远记住,Storyboard里的segue、连线等配置,只属于从Storyboard初始化出来的控制器实例,手动用类构造方法创建的实例是“干净”的,没有这些配置信息。
内容的提问来源于stack exchange,提问作者Shivam Trivedi
相关产品推荐
相关产品推荐

