如何将动作从 SKScene 组件传播到 UIViewController

Posted

技术标签:

【中文标题】如何将动作从 SKScene 组件传播到 UIViewController【英文标题】:How to propagate the action from SKScene component to UIViewController 【发布时间】:2020-12-18 20:27:10 【问题描述】:

在 XCode 12 中,使用 Swift 5,使用 Game SpriteKit 技术创建一个新项目。除其他外,这会产生:

GameViewController.swift GameScene.swift

在 GameScene.swift 中我添加了

    在类定义之后

    let tapRec2 = UITapGestureRecognizer()
    

    in override func didMove(to view: SKView)

    tapRec2.addTarget(self, action:#selector(GameScene.tappedView2(_:) ))
    tapRec2.numberOfTouchesRequired = 1
    tapRec2.numberOfTapsRequired = 2  //2 taps i
    self.view!.addGestureRecognizer(tapRec2)
    

    tappedView2 函数的实现来检测双击。

    @objc func tappedView2(_ sender:UITapGestureRecognizer) 
      let controller = self.view?.window?.rootViewController
      let new_controller = ViewController()
      print("double click detected")
      controller?.navigationController?.pushViewController(new_controller, 
      animated: true)
    
    
然后我使用模板 https://gist.github.com/phynet/075d538c93c0bfe62596bc4d47a482e1 创建了一个 ViewController 类

我编译并运行它,应用程序正常启动,如果我双击它会检测到它,但是没有显示 ViewController。我做错了什么?

【问题讨论】:

【参考方案1】:

通过将 tappedView2 简化为以下代码找到了解决方案:

  @objc func tappedView2(_ sender:UITapGestureRecognizer) 
    let new_controller = ViewController()
    self.view?.window?.rootViewController = new_controller
  

并将 UIViewController 简化为:

  import UIKit
  import Foundation
  class ViewController: UIViewController  

      override func viewDidLoad() 
         super.viewDidLoad()
      
  

【讨论】:

启动新控制器的方法不合适,因为它替换了 rootViewController 而不是 pushViewController。

以上是关于如何将动作从 SKScene 组件传播到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SKScene 到 UIViewController?

从 Vuex 动作和组件更改路由

如何将SKScene添加到SCNNode平面?

Vuex:传播对兄弟组件的响应

如何以编程方式从 SKScene 到 UIViewController 执行成功的 segue

将 JavaScript 鼠标事件从一个元素传播到另一个元素?