通过Deep Link打开ViewController时导航栏消失问题求助
解决Deep Link打开ViewController时导航栏消失的问题
嘿,我之前也碰到过类似的情况,导航栏消失大概率是因为你直接实例化的ViewController没有被纳入UINavigationController的层级中,或者导航栏的配置出了问题。给你几个实用的解决思路:
1. 确保目标ViewController被嵌入导航控制器层级
当你通过Deep Link直接初始化ViewController时,如果它不是UINavigationController的子控制器,导航栏自然不会显示。你可以修改AppDelegate里的代码,把目标VC放到导航控制器的流程里:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { print("url \(url)") print("url host :\(url.host!)") print("url path :\(url.path)") let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) // 替换成你实际的ViewController标识符和类型 guard let targetVC = mainStoryboard.instantiateViewController(withIdentifier: "YourTargetVC") as? YourTargetViewController else { return false } // 处理当前窗口的根控制器逻辑 if let window = UIApplication.shared.keyWindow { if let navController = window.rootViewController as? UINavigationController { // 如果根控制器已经是导航控制器,直接push目标VC navController.pushViewController(targetVC, animated: true) } else { // 如果不是,创建新的导航控制器包裹目标VC,再设置为根控制器 let navController = UINavigationController(rootViewController: targetVC) window.rootViewController = navController } } return true }
2. 检查Storyboard和ViewController的导航栏配置
有时候即使嵌入了导航控制器,也可能因为配置问题导致导航栏不显示:
- 打开Storyboard,选中目标ViewController,在右侧属性面板确认
Navigation Item的配置正常(比如有没有设置标题,未勾选隐藏导航栏)。 - 选中对应的UINavigationController,确保属性面板中的
Shows Navigation Bar选项是勾选状态。 - 也可以在目标VC的
viewDidLoad中手动强制显示导航栏:override func viewDidLoad() { super.viewDidLoad() // 强制显示导航栏 self.navigationController?.isNavigationBarHidden = false // 设置导航栏标题(可选) self.title = "目标页面" }
3. iOS 13+ 注意SceneDelegate的处理
如果你的App适配了iOS 13及以上版本,Deep Link的触发逻辑可能会走到SceneDelegate的scene(_:openURLContexts:)方法中,这时候需要在该方法里做同样的导航层级处理:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) guard let targetVC = mainStoryboard.instantiateViewController(withIdentifier: "YourTargetVC") as? YourTargetViewController else { return } if let windowScene = scene as? UIWindowScene, let window = windowScene.windows.first { if let navController = window.rootViewController as? UINavigationController { navController.pushViewController(targetVC, animated: true) } else { let navController = UINavigationController(rootViewController: targetVC) window.rootViewController = navController window.makeKeyAndVisible() } } }
一般来说,只要把目标VC纳入导航控制器的层级中,导航栏就能正常显示了,你可以先试试第一种方法~
内容的提问来源于stack exchange,提问作者mdehghani
相关产品推荐
相关产品推荐

