swift 从SKScene移动到ViewController

bakd9h0s  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(123)

当我触摸SKSpriteNode时,我想从SKScene移动到视图控制器,当我触摸UIButton时,我想返回到SKScene。它从视图控制器到SKScene以及相反的方式工作,但只有第一次。当我然后返回到我的场景并再次移动到视图控制器时(第二次),我可以听到音乐,它打印了viewDidLoad的所有内容,但它没有显示UI元素。我驳回了场景,所以这可能不是问题所在。
下面是从场景移回视图控制器的代码。

let currentViewController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!        
currentViewController.present(ViewController(), animated: false, completion: nil)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier :"VC")
let currentViewController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!

currentViewController.present(viewController, animated: false, completion: nil)
41zrol4v

41zrol4v1#

将与currentViewController相关的代码替换为:

self.view?.window?.rootViewController?.present(viewController, animated: true, completion: nil)

你也可以在Storyboard中创建一个segue,并像这样调用它:

self.view?.window?.rootViewController?.performSegue(withIdentifier: "VC", sender: self)

编辑:
我已经尝试了我的应用程序之一,现在下一个解决方案,它的工作:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "VC")
vc.view.frame = rootViewController.view.frame
vc.view.layoutIfNeeded()

UIView.transition(with: window, duration: 0.3, options: .transitionFlipFromRight, animations:
        {
        window.rootViewController = vc
    }, completion: { completed in
        // maybe do something here
    })

对我来说它起作用了,我希望它能解决你的案子:)

gkn4icbw

gkn4icbw2#

新方案:

假设你有一个名为“GameViewController”的视图控制器文件,它与名为“GameScene”的文件相链接。您想从“GameScene”移动到“NextViewController”。
请仔细遵循以下步骤:
1.在故事板中创建一个从“GameViewController”屏幕到“NextViewController”的手动segue关系,例如选择“Show”
1.在属性检查器中:使用下拉菜单分配标识符(例如“ShowNext”)、类(例如“ShowSegue”)和模块。
1.在“GameViewController”中创建一个名为“ShowSegue”的类,如图所示,并确保导入UIKit和SpriteKit:

class ShowSegue: UIStoryboardSegue {
   override func perform() {
       source.navigationController?.pushViewController(destination, animated: true)
   }
}

1.在“viewDidLoad()”函数内的GameViewController类中添加以下代码:

override func viewDidLoad()
{
    super.viewDidLoad()
    let scene = GameScene(size : view.bounds.size) // <- GameScene
    scene.sceneDelegate = self // <- must add this
    let skView = view as! SKView
    scene.scaleMode = .resizeFill
    skView.presentScene(scene)
}

1.在“GameScene”文件中,在顶部添加以下代码,确保导入SpriteKit:

protocol GameSceneDelegate: AnyObject {
    func presentNextViewController()
}

class DelegateWrapper {
    weak var delegate: GameSceneDelegate?
}

struct SharedInstances {
    static let delegateWrapper = DelegateWrapper()
}

1.在“GameScene”类的didMove()函数中添加:

SharedInstances.delegateWrapper.delegate = sceneDelegate

1.在触发按钮按下的函数中添加代码:

SharedInstances.delegateWrapper.delegate?.presentNextViewController()

根据需要更改变量的名称。

相关问题