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

为何无法从根视图向嵌入的容器视图传递数据?

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:17