无法从SpriteKit Skscene转移到另一个UiviewController Xcode8/swift



我完全坚持尝试从我的spritekit游戏的第五个也是最后一个场景中执行一个项目中的另一个视图控制器(不是GameViewController,也不是root View Controller)。

我尝试运行self.view!.window!.rootviewController!.performsegueWithIdentifier(" finalsegue",sender:self self),我从我的peralscene中,但实际上什么也没做(线条都没有触发通过" print(self.view!.window!.rootviewController!)进行检查,请按照我指示的" segue" prints" segue读",在segue命令之后,作为检查,segue标识符是正确的,但什么也没发生)。<<<<<<<<<<)。/p>

尝试调用一种从GameViewController(我启动5个Skscenes视图的视图控制器)执行SEGUE的方法,我"在解开可选值的同时出乎意料地找到了无零"。尝试从最终场景(" finalscene.swift")中执行segue,同样的错误。

在论坛中的其他问题中尝试了所有和所有相关的解决方案,以及"发件人:" performsegue方法字段中nil/self/view controller的所有组合,无济于事。这是我试图制作的代码,它给出了"在解开可选值的同时出现意外发现",指向ViewController var,但在设备上和模拟器上都加载时进行了无法理解的调试。似乎" nil"传递到我正在声明的ViewController var,而不是原始的GameViewController?

我所有的segue标识符在故事板上都是正确的,一切都经过了多次检查...我在做什么错?考虑到它的第五个SKSCENE而不是第一个(如其他解决方案中),我应该做一些不同的事情吗?从另一个UiviewController锻炼出gameviewController,进入了Skscenes,它的工作不错 - 它的退出是不起作用的。非常感谢您的任何帮助,完全卡在这里!

这是我的相关代码:

在我的GameViewController(连续5个skscenes启动的UiviewController)中:

    class GameViewController: UIViewController {
        let myScene = finalScene()
        override func viewDidLoad() {
            super.viewDidLoad()
    if let view = self.view as! SKView? {
//this is the 1st out of 5 SKScenes in the project
                let scene = GameScene(size: CGSize(width: 2048, height: 2742))
//this is the 5th out of 5 scenes, that I am trying to trigger the segue out of
                myScene.viewController = self
                view.presentScene(scene)
                view.ignoresSiblingOrder = true 
        }
    }
    }

我是我的第五个场景,决赛:

class finalScene: SKScene {
    var viewController: GameViewController!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches{
            let positionOfTouch = touch.location(in: self)
            let tappedNode = atPoint(positionOfTouch)
            let nameOfTappedNode = tappedNode.name
            if nameOfTappedNode == "continue" {
 self.viewController.performSegue(withIdentifier: "finalSegue", sender: self)            
}
        }
    }

仅适用于可能遇到此问题的任何人,我通过使用通知中心解决了它。IE在游戏场景的父视图控制器上添加了一个通知观察者(称为执行SEGUE的函数),在我想执行SEGUE的游戏的终点上,我发布了该通知,并且可以正常太好了。

在UiviewController的ViewDidload中添加观察者:

    override func viewDidLoad() {
        super.viewDidLoad()
            NotificationCenter.default.addObserver(self, selector: #selector(GameViewController.doaSegue), name: NSNotification.Name(rawValue: "doaSegue"), object: nil)
}
    func doaSegue(){
        performSegue(withIdentifier: "toNext", sender: self)
        self.view.removeFromSuperview()
        self.view = nil
    }

然后从游戏中呼叫它:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "doaSegue"), object: nil)

您在root ViewController上调用SEGUE。我认为这是问题所在。您需要在场景的ViewController上调用SEGUE(我认为您已经创建了Segue,因此在root ViewController上找不到它)。

现在问题是Skscene无法直接访问其ViewController,而只是其中包含的视图。您需要手动创建指针。这可以通过为Skscene创建属性来完成:

class GameScene: SKScene {
    var viewController: UIViewController?
    ...
}

然后,在skview.presentscene(场景)

之前,在ViewController类中
scene.viewController = self

现在,您可以直接访问ViewController。只需在此ViewController上调用SEGUE:

func returnToMainMenu(){
    self.viewController.performSegueWithIdentifier("menu", sender: vc)
}

找到了这种工作的方法。但是我确实更喜欢上面提到的方法,因为它的行较少。我确实想知道哪个更适合性能...

最新更新