为何无法从根视图向嵌入的容器视图传递数据?
解决DetailChildViewController的properties赋值后仍为nil的问题
嗨,我一眼就瞅出你代码里的关键问题啦!你在prepare(for segue:)里犯了一个很常见的新手错误——你手动创建了一个全新的DetailChildViewController实例,但实际显示在容器视图里的是Storyboard通过segue自动实例化的那个控制器对象。你给自己new的那个实例赋值了properties,但它根本不是屏幕上展示的那个,所以自然会出现properties还是nil的情况。
修正后的代码
直接用segue.destination获取Storyboard已经创建好的目标控制器,而不是自己初始化:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 先确认是我们要处理的segue if segue.identifier == "DetailChildSegue" { // 安全地将segue目标转换为DetailChildViewController guard let detailChildVC = segue.destination as? DetailChildViewController else { print("无法将目标控制器转换为DetailChildViewController,请检查Storyboard配置") return } // 优化actionArray的处理,避免强制转换带来的崩溃 if let actionKeys = product?.action.keys { detailChildVC.properties = Array(actionKeys) } else { // 给个默认空数组,防止后续集合视图因为nil崩溃 detailChildVC.properties = [] } } // 记录当前显示的控制器 currentVC = segue.destination }
额外需要检查的几个点
- 确保Storyboard中容器视图的segue标识符完全匹配"DetailChildSegue"(大小写敏感,别打错字)
- 确认Storyboard里的子控制器,其Class属性已经设置为你的
DetailChildViewController(而不是默认的UIViewController) - 如果
product可能为nil,建议在更早的地方做判断,避免后续逻辑出现意外问题
内容的提问来源于stack exchange,提问作者Julienne Lim
相关产品推荐
相关产品推荐

