Swift 4不使用Segue传值至UINavigationController崩溃,求解决方法
首先看你代码崩溃的核心原因:你遇到的Could not cast value of type 'UINavigationController'...错误,本质是类型不匹配或者传值目标找错了——要么是你把普通UIViewController强制转成了UINavigationViewController,要么是错误地给导航控制器本身设置了它没有的sendValue属性(这个属性应该属于导航控制器内部的子控制器)。
下面分两种常见场景给你解决方案:
场景1:Storyboard里已配置好UINavigationViewController
假设你在storyboard中已经创建了一个UINavigationViewController,它的Storyboard ID是MainMenuNavId,并且它的Root View Controller是你需要传值的MainMenuViewController(比如其ID为MainMenuId)。
正确传值逻辑是先拿到导航控制器,再获取它的根控制器,最后给根控制器赋值:
// 1. 安全实例化导航控制器(用可选绑定避免强制解包崩溃) if let navVC = storyboard?.instantiateViewController(withIdentifier: "MainMenuNavId") as? UINavigationViewController { // 2. 获取导航控制器的根控制器,转成目标类型 if let mainMenuVC = navVC.rootViewController as? MainMenuViewController { // 3. 给目标控制器的自定义属性赋值 mainMenuVC.sendValue = "你要传递的字符串内容" } // 4. 弹出导航控制器 self.present(navVC, animated: true, completion: nil) }
场景2:动态将目标VC包装进UINavigationViewController
如果你的MainMenuViewController是独立VC,需要临时把它放进新的导航控制器里展示,那应该先实例化目标VC并完成传值,再将其包装进导航控制器:
// 1. 安全实例化目标业务控制器 if let mainMenuVC = storyboard?.instantiateViewController(withIdentifier: "MainMenuId") as? MainMenuViewController { // 2. 先给目标控制器的自定义属性赋值 mainMenuVC.sendValue = "你要传递的字符串内容" // 3. 创建导航控制器并把目标VC设为根控制器 let navVC = UINavigationController(rootViewController: mainMenuVC) // 4. 弹出导航控制器 self.present(navVC, animated: true, completion: nil) }
关键注意事项
- 避免强制解包
!:强制解包会在实例化失败或类型转换失败时直接崩溃,用if let的可选绑定更安全。 - 找对传值目标:
sendValue这类自定义业务属性属于导航控制器内部的业务VC,而非导航控制器本身——导航控制器只是容器,它本身不会有你自定义的业务属性。
内容的提问来源于stack exchange,提问作者mab
相关产品推荐
相关产品推荐

