如何正确地转到不同的 ViewController

How to segue to different ViewController properly

你好,我已经设置了代码,应该可以正确地从 GameScene 转到另一个视图控制器 mainMenuViewController。我为实现这一目标而设置的代码是

var viewController: GameViewController!
func segue() {
    viewController.dismissViewControllerAnimated(true, completion: nil)
    SettingsViewController.delete(self)
}

在 GameViewController 中

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    let skView = view as! SKView
    let scene = GameScene(size: skView.bounds.size)

    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = false
    //skView.showsPhysics = true
    scene.scaleMode = .AspectFill
    skView.presentScene(scene)        
    scene.viewController = self
}

}

点击 SKLabelNode 时调用。我收到了使用它的建议,因为 mainMenu 是玩家开始游戏时首先加载的场景,他们会转到 gameScene,所以我被告知要关闭 GameScene 而不是每次都创建一个新的 segue。每当点击按钮时,我都会收到错误 'fatal error: unexpectedly found nil while unwrapping an Optional value' 和崩溃。我假设它在谈论 viewController。感谢您的帮助!

如果您的问题理解正确,您正在尝试关闭 GameViewController。但是方法 dismissViewControllerAnimated 只会解除您当前正在呈现的控制器。因此,由于您的游戏视图控制器没有显示任何内容,因此无法将其关闭。正如您从代码到 GameViewController 所说的那样,关闭他提供的控制器,它会尝试按照您的意愿进行操作,以便他获得他的 属性 呈现的视图控制器并尝试关闭它,但是 属性 是 nil所以这样的错误得到。要解决此问题,您应该调用 viewController.presentingViewController.dismissViewControllerAnimated(true, completion: nil) 。 属性 presentingViewController returns 呈现给你的控制器,在你的例子中是呈现 GameViewController 的控制器。当您获得此控制器时,您可以关闭他提供的控制器(在您的情况下,提供的控制器是您的 GameViewController)。所以逻辑就是说 "parent" 控制器有权解雇你自己(GameViewController)

我需要查看您的代码。现在您尝试调用方法 delete 来查看控制器,但据我所知,视图控制器没有这样的接缝。所以认为这是您程序中的其他错误,主要是您将 Noble_Ninja.SettingsViewController 设置为其他期望具有此类方法的对象。那是我的预测我不能说清楚,因为我只有异常描述。尝试找到您在代码中调用此方法的位置,而不是在那里放置制动点,当程序在您的制动点上停止时写入您的控制台(日志)-(po NAME_OF_INSTANCE_THAT_CALLS_SUCH_METHOD)-,它将显示真实的实例类型,因此您可以通过此信息检测出真正的问题所在。祝你好运