2016-10-20 7 views
1

У меня есть игровое меню с помощью кнопки запуска игры:Present ViewController с Scene

@IBAction func startGame(_ sender: AnyObject) { 
     if let vc = self.storyboard?.instantiateViewController(withIdentifier: "gameViewController") as? GameViewController { 
      vc.modalTransitionStyle = .crossDissolve 
      self.present(vc, animated: true, completion: nil) 
     } 
    } 

игры над кодом:

if lifes == 0 { 
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController { 
     vc.modalTransitionStyle = .crossDissolve 
     self.present(vc, animated: true, completion: nil) 
    } 
} 

Когда пользователь нажимает на кнопку я показать новый контроллер с Sprite Kit сцены просмотра. Но когда игра окончена, я возвращаюсь в меню. И если мы нажмем Запустите игру снова, fps падает с 60 (в моем случае) до 30, а затем снова до 20 и т. Д. Кажется, что старый контроллер просмотра все еще работает. Как уволить?

Я читал похожие вопросы, но не нашел в них ответа.

+0

Покажите нам код, соответствующий игре over event – alexburtnik

+0

@alexburtnik, но в главном меню – Arti

+0

Если вы не предоставите более подробную информацию о том, как вы уволили своего контроллера, я не могу вам помочь. «та же функция, но в главное меню», это не то, что я спросил. Укажите свой код. – alexburtnik

ответ

1

Хорошо, теперь ваша проблема понятна.

Вы не должны представлять новый MainViewController, когда игра окончена. Это приведет вас к потенциально бесконечному стеке контроллеров представлений вроде этого: Главная -> Игра -> Главная -> Игра -> ... Вместо этого вы должны отклонить игру Vc и вернуться к предыдущему контроллеру, чтобы вы всегда были имеют один или два контроллера в памяти.

Таким образом, вы должны заменить это:

if lifes == 0 { 
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainMenuViewController") as? MainMenuViewController { 
     vc.modalTransitionStyle = .crossDissolve 
     self.present(vc, animated: true, completion: nil) 
    } 
} 

С этим:

if lifes == 0 { 
    dismiss(animated: true, completion: nil) //will bring you to previous Main vc 
} 

Edit:

Если у вас есть более чем два контроллера, чтобы показать, вы должны рассмотреть навигационный контроллер подход. В основном вы создаете его с помощью rootViewController (MainVC), затем нажмите GameVC, а затем нажмите GameOver.

В MainVC:

self.navigationController?.pushViewController(gameVC, animated: true) 

В GameVC:

self.navigationController?.pushViewController(gameOverVC, animated: true) 

Чтобы выдвинуть только только один контроллер:

self.navigationController?.popViewController(animated: true) 

поп к первому контроллеру:

self.navigationController?.popToRootViewController(animated: true) 
+0

, но если у меня будет несколько контроллеров, таких как: Меню-> игра-> GameOver-> Меню? Как удалить контроллер Game View после завершения? – Arti

+0

@Arti: Вам лучше использовать навигационную стек для этой цели. Посмотрите обновленный ответ. – alexburtnik

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