2015-03-26 4 views
0

, поэтому я нашел несколько сообщений о переходе от Skscene к uiviewcontroller, и я получил его для работы. Этот segue и unind segue вызывается каждый раз, когда пользователь выигрывает уровень моей игры или проигрывает.Переход на viewController из SKScene нашел нуль при разворачивании необязательного значения

это работает для ровном1, но как только я выиграю level2 я получаю

fatal error: unexpectedly found nil while unwrapping an Optional value 

на линии, где я называю игру над функцией ниже

в моей игровой сцене у меня есть:

class GameScene: SKScene, SKPhysicsContactDelegate { 

//next level/try again segue 
var viewController : GameViewController! 

в GameViewController я инициализировать это свойство

var currentLevel: Int! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    currentLevel = gameScene.currentLevel 
    if let scene = GameScene.level(currentLevel) { 
     // Configure the view. 
     let skView = self.view as SKView 
     skView.showsFPS = true 
     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 

     skView.presentScene(scene) 

     //initialize VC 
     scene.viewController = self 
    } 

func gameOver() { 
    performSegueWithIdentifier("gameOver", sender: nil) 
} 

@IBAction func perpareForUnwind(unwindSegue: UIStoryboardSegue) { 

} 

и, наконец, я называю GameOver из моей функции выигрыша() в gameScene

func newGame() { 
    view!.presentScene(GameScene.level(currentLevel)) 
} 

func win() { 
    if (currentLevel < 3) { 
     currentLevel++ 
     //present win view - with option to restart, next level, or home 
    } 
    println(currentLevel) 
    runAction(SKAction.sequence([SKAction.waitForDuration(2), 
     SKAction.runBlock(newGame)])) 
    self.viewController.gameOver() // this is the error! 
} 

Так это работает от ровном1 к level2, но не будут работать от level2 до LEVEL3

С viewDidLoad вызывается только один раз это только инициализируется от lvl1 до lvl2 и затем становится nil. Как я могу убедиться, что он инициализируется каждый раз. Shoud Я поставил этот код кода где-то, кроме viewDidLoad?

ответ

0

С уровня 1 до уровня 2 ваш просмотр varController не равен нулю, потому что вы инициализируете его самостоятельно на viewDidLoad.

Но затем, на следующий уровень, ViewController равен нулю, потому что ваш код

//initialize VC 
scene.viewController = self 

только исполняются на viewDidLoad в вашем GameViewController.

Вы должны установить значение своего вида viewController в вашем методе инициализации сцены или в файле didMoveToView, поэтому он устанавливается для каждой новой сцены.

+0

если я делаю что я получаю 'Receiver () не имеет SEGUE с идентификатором 'GameOver'' я удалил строки scene.viewController = сам от viewdidLoad и в didMoveToView добавил ViewController = GameViewController() – Jeremy

+0

Я думаю, это потому, что вы устанавливаете viewController на новый GameViewController. Вы должны установить его на существующий, попробуйте это: viewController = self.view.window.rootViewController –

+0

нет, это не работает либо к сожалению! – Jeremy

Смежные вопросы

 Смежные вопросы