XCode12+Swift5下SpriteKit场景双击跳转ViewController失败排查
问题诊断与解决办法
首先,咱们来拆解一下为什么双击能被检测到,但新的ViewController却没展示出来:
核心问题:缺少导航控制器上下文
你代码里用了controller?.navigationController?.pushViewController(...),但这个写法有个关键前提——你的App根控制器必须是UINavigationController,且GameViewController是它的根视图控制器。如果启动时直接把GameViewController设为rootViewController,那controller?.navigationController就会是nil,自然执行不了push操作。
具体解决步骤:
修改启动配置,添加导航控制器
打开SceneDelegate.swift(iOS 13及以后)或AppDelegate.swift(iOS 12及以前),找到设置根控制器的代码。原来的代码大概是这样:let gameVC = GameViewController() window?.rootViewController = gameVC改成把
GameViewController包裹在导航控制器里:let gameVC = GameViewController() let navVC = UINavigationController(rootViewController: gameVC) window?.rootViewController = navVC确保新控制器可见
如果你是纯代码创建的ViewController,记得给它的view设置背景色,不然就算push成功,也可能因为视图透明而看不到:class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 加上这行确保视图可见 } }备选方案:不用导航控制器,改用present
要是你不需要导航栏,也可以用模态展示的方式打开新控制器:@objc func tappedView2(_ sender:UITapGestureRecognizer) { print("double click detected") let new_controller = ViewController() new_controller.modalPresentationStyle = .fullScreen // 按需设置展示样式 self.view?.window?.rootViewController?.present(new_controller, animated: true) }
额外排查小技巧
可以在push代码前加个打印,快速确认导航控制器是否存在:
print("导航控制器是否存在:\(controller?.navigationController != nil)")
如果打印结果是false,那就坐实了是导航控制器缺失的问题。
内容的提问来源于stack exchange,提问作者Luca Toldo
相关产品推荐
相关产品推荐

