2015-10-26 2 views
0

Я использовал следующий код с большим успехом происходит от главного меню (UIViewController) к Game Play (GameViewController.swift - UIViewController).Фатальная ошибка пытается перейти от GameScene к ViewController с раскадровки ID

Я также протестировали главного меню к Game Over зрения (UIViewController), чтобы убедиться, что Game Over зрения все подключили правильно, и она работает нормально, но я пытался вызвать функцию из GameScene.swift (SKScene) to GameViewController.swift переключить представление, когда игра закончилась (игра с видом).

Но я получаю Фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение

Почему бы я получаю эту ошибку от попыток выйти из GameScene.swift через GameViewController.swift, но не из любой другой UIViewController, как Главное меню или Игра?

func goToGameOver() { 
     print("Fetched: goToGameOver()") 
     let gameOverController = self.storyboard?.instantiateViewControllerWithIdentifier("GameOverController") as? GameOverController 
     gameOverController!.missionMode = missionMode 
     gameOverController!.missionLevel = missionLevel 
     self.navigationController?.pushViewController(gameOverController!, animated: true) 
    } 

Если вам нужна дополнительная информация, чтобы помочь, пожалуйста, сообщите мне.

Спасибо за помощь!


Обновленный код

Мой раскадровка назван Main.storyboard

Я обновил кодом на основе и ответ ниже, и, как вы можете увидеть в комментариях, я буду больше не получаю никаких ошибок, но я также не вижу изменения/переключения в представлениях моего представления GameScene в GameOverController.

func goToGameOver() { 
     print("Fetched: goToGameOver()") 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let gameOverController = storyboard.instantiateViewControllerWithIdentifier("GameOverController") as? GameOverController 
     gameOverController!.missionMode = missionMode 
     gameOverController!.missionLevel = missionLevel 
     self.navigationController?.pushViewController(gameOverController!, animated: true) 
    } 

Update, чтобы показать раскадровки установки.

Не мог ли он получить ответ, потому что мой контроллер игровых сцен (UIViewControllers) вошел в SKScene, и теперь контроллер навигации сломан? Кажется странным, что я не получаю никаких ошибок ...

This is my pages basic storyboard setup

Верхний левый: Навигационный контроллер

Top Центр: Главная Manu контроллер

Top Right: Игра Scene Controller

Нижняя часть: Контроллер игры


Обновление обеспечения GameViewController.swift

Вот мой игровой контроллер просмотра, и я не назначил навигационный контроллер, потому что мне, похоже, не нужно было это делать в моем контроллере главного меню или игровом контроллере. Как я могу назначить навигационный контроллер в swift?

import UIKit 
import SpriteKit 
import iAd 

class GameViewController: UIViewController, ADBannerViewDelegate { 

    var iAdBanner = ADBannerView() 
    var bannerVisible = false 

    var missionMode: Bool! 
    var missionLevel: Int! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let scene = GameScene(fileNamed:"GameScene") { 
      // Configure the view. 
      let skView = self.view as! SKView 
      skView.showsFPS = true 
      scene.size = skView.bounds.size 
      skView.showsNodeCount = true 

      /* Sprite Kit applies additional optimizations to improve rendering performance */ 
      skView.ignoresSiblingOrder = true 

      /* Set the scale mode to scale to fit the window */ 
      scene.scaleMode = .AspectFill 

      scene.missionMode = missionMode 
      scene.missionLevel = missionLevel 

      skView.presentScene(scene) 
     } 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     iAdBanner.frame = CGRectMake(0, -iAdBanner.frame.height, self.view.frame.width, 0) 
     iAdBanner.delegate = self 
     bannerVisible = false 
    } 

    func bannerViewDidLoadAd(banner: ADBannerView!) { 
     if(bannerVisible == false) { 

      // Add banner Ad to the view 
      if(iAdBanner.superview == nil) { 
       self.view.addSubview(iAdBanner) 
      } 

      // Move banner into visible screen frame: 
      UIView.beginAnimations("iAdBannerShow", context: nil) 
      banner.frame = CGRectOffset(banner.frame, 0, banner.frame.size.height) 
      banner.alpha = 1 
      UIView.commitAnimations() 
      bannerVisible = true 
     } 

    } 

    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { 
     if(bannerVisible == true) { 
      // Move banner below screen frame: 
      UIView.beginAnimations("iAdBannerHide", context: nil) 
      banner.frame = CGRectOffset(banner.frame, 0, -banner.frame.size.height) 
      banner.alpha = 0 
      UIView.commitAnimations() 
      bannerVisible = false 
     } 

    } 

    func goToGameOver() { 
     print("Fetched: goToGameOver()") 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     print(storyboard) 
     let gameOverController = storyboard.instantiateViewControllerWithIdentifier("GameOverController") as! GameOverController 
     gameOverController.missionMode = missionMode 
     gameOverController.missionLevel = missionLevel 
     print(gameOverController) 
     self.navigationController?.pushViewController(gameOverController, animated: true) 
    } 

    override func shouldAutorotate() -> Bool { 
     return true 
    } 

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     if UIDevice.currentDevice().userInterfaceIdiom == .Phone { 
      return .AllButUpsideDown 
     } else { 
      return .All 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Release any cached data, images, etc that aren't in use. 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 
} 
+0

вы проверить, если ваш navigationcontroller не ноль, кажется как и ваша последняя проблема, ваша раскадровка была нулевой. Если это внутри вашей игровой сцены, возможно, это то, что происходит, как назначается диспетчер навигации? – Knight0fDragon

+0

В настоящий момент мой контроллер навигации назначен контроллеру главного меню. Первое представление, которое отображается. Я покажу скриншот выше моей настройки раскадровки. –

+0

@ Knight0fDragon Я получаю следующее при печати раскадровки и постоянной константы gameOverController:

ответ

0

я не знаю, как раскадровки инициализации, но вы можете указать свой раскадровки с проектом

func goToGameOver() { 
     print("Fetched: goToGameOver()") 
     let storyboard = UIStoryboard(name: "YourStoryBoardName", bundle: nil) 
     let gameOverController = storyboard.instantiateViewControllerWithIdentifier("GameOverController") as? GameOverController 
     gameOverController!.missionMode = missionMode 
     gameOverController!.missionLevel = missionLevel 
     self.navigationController?.pushViewController(gameOverController!, animated: true) 
    } 

должны работать

+0

Очень странно, я пробовал следующее, и теперь у меня нет ошибок, но я тоже не получаю новое представление. Поэтому мой экран не меняется на GameOverController. это было бы потому, что я пытаюсь переключить представления из моего GameScene.swift (SKScene), вызвав функцию из GameViewController.swift (UIViewController). Мой путь к раскадровке Main.storyboard. Обновленный код выше. –

+0

я проверю это –

+0

Спасибо @ Özgür Я ценю помощь. –