2015-10-20 6 views
2

Я строю в iOS 9 с Swift 2.0. У меня есть мой начальный UIViewController, который является моим экраном меню. Он содержит следующий код:Segue to UIViewController без инициализации нового объекта

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let id = segue.identifier where id == "GamePlayScene" { 
     self.gameVC = segue.destinationViewController as? GameViewController 
     self.gameVC!.delegate = self 
     if let s = sender as? GKTurnBasedMatch { 
      self.gameVC!.match = s 
     } 
    } 
} 

Когда segueing моего GameViewController, следующая инициализация работает до того, что prepareForSegue даже вызывается:

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    GKLocalPlayer.localPlayer().registerListener(self) // I only want this once 
} 

В раскадровке мой GameViewController есть кнопка «Меню», которое подключенный к выходному виджету для контроллера вида, и он разматывается в Меню по своему усмотрению. Но всякий раз, когда я снова выполняю segue, init снова вызывается, поэтому теперь у меня есть несколько GameViewControllers. Я думаю, что это замедляет мое приложение, поскольку я использую SKScenes. Как выполнить segue без создания нового объекта каждый раз?

func player(player: GKPlayer, receivedTurnEventForMatch match: GKTurnBasedMatch, didBecomeActive: Bool) { 
    if didBecomeActive { 
     // This event is what activated the app, so the user wants it right meow 
     GameKitHelper.sharedInstance.match = match 
     performSegueWithIdentifier("GamePlayScene", sender: match) 
    } 
} 

ответ

1
GKLocalPlayer.localPlayer().registerListener(self) // I only want this once 

Путь вызвать строку кода для запуска только один раз в течение срока службы приложения является с dispatch_once.

+0

Очень полезная функция, спасибо. – dem7w2

3

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

Способ сделать это, чтобы создать новый класс Swift и сделать его доступным как общий экземпляр, где второй контроллер представления хранится в частной собственности. Второй контроллер представлений создается, если он еще не был инициализирован. Дальнейшие результаты поиска контроллера представления возвращают сохраненный контроллер представления, тем самым устраняя необходимость инициализации контроллера вида. Операции по созданию контроллера представления, его сохранению и возврату обрабатываются получателем общедоступного вычислимого свойства.

Вот код класса:

Singleton.swift:

import Foundation 
import UIKit 

class Singleton { 

    static let sharedInstance = Singleton() 

    var gameViewController: GameViewController { 
     get { 
      if self.storedViewController == nil { 
       let storyboard = UIStoryboard(name: "Main", bundle: nil) 
       self.storedViewController = 
        storyboard.instantiateViewControllerWithIdentifier("GameViewController") as? GameViewController 
      } 

      return self.storedViewController! 
     } 
    } 

    private var storedViewController: GameViewController? 

} 

Чтобы использовать эту функцию, необходимо будет использовать showViewController метод, показывающий контроллер вида игры вместо используя segue.

В первом контроллере представления у меня есть:

@IBAction func buttonWasPressed(sender: AnyObject) { 
    let vc = Singleton.sharedInstance.gameViewController 
    navigationController?.showViewController(vc, sender: self) 
} 

Второй контроллер (GameViewController) теперь будет созданы только один раз и повторно используется каждый раз, когда нажата кнопка на первый контроллер представления.

+0

Остается работать функция выхода GameViewController? Когда я перехожу к меню, все ли освобождается? – dem7w2

+1

@ dem7w2 В моем примере используется контроллер навигации. При нажатии кнопки «Назад» контроллер просмотра не освобождается. Использование этой оптимизации может потребовать изменения способа навигации между представлениями. Я не верю, что он поддержит использование segues в раскадровке. Однако относительно легко настроить контроллер навигации с помощью 'showViewController: sender:' и 'popViewControllerAnimated:'. – Daniel

+0

Это немного сложнее, чем в том случае, когда есть другие экраны, такие как «Параметры» и «Вызовы» и «Сольный режим», которым необходимо увидеть дополнительный вид, прежде чем перейти к контроллеру игрового представления. Тем не менее, 'showViewController', скорее всего, сделает то, что мне нужно, спасибо. – dem7w2

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