Я использовал следующий код с большим успехом происходит от главного меню (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, и теперь контроллер навигации сломан? Кажется странным, что я не получаю никаких ошибок ...
Верхний левый: Навигационный контроллер
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
}
}
вы проверить, если ваш navigationcontroller не ноль, кажется как и ваша последняя проблема, ваша раскадровка была нулевой. Если это внутри вашей игровой сцены, возможно, это то, что происходит, как назначается диспетчер навигации? – Knight0fDragon
В настоящий момент мой контроллер навигации назначен контроллеру главного меню. Первое представление, которое отображается. Я покажу скриншот выше моей настройки раскадровки. –
@ Knight0fDragon Я получаю следующее при печати раскадровки и постоянной константы gameOverController: –