2015-08-11 13 views
13

Sono nuovo a Swift e voglio sapere come chiudere il controller di visualizzazione corrente e passare a un'altra vista.Come chiudere il ViewController corrente e passare a un'altra vista in Swift

Il mio storyboard è simile al seguente: MainMenuView -> GameViewController -> GameOverView. Voglio chiudere il GameViewController per andare su GameOverView, non su MainMenuView.

Io uso il seguente codice nel mio MainMenuView:

@IBAction func StartButton(sender: UIButton) { 
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
    let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("GameViewController") as! GameViewController 
    self.presentViewController(nextViewController, animated:true, completion:nil) 
    restGame() 
} 

Nel GameViewController, io uso questo codice, ma non elimina il GameViewController.

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("GameOverView") as! GameOverView 
self.presentViewController(nextViewController, animated:true, completion:nil) 

Questo è il mio codice GameOverView:

class GameOverView: UIViewController{ 
    // save the presenting ViewController 
    var presentingViewController :UIViewController! = self.presentViewController 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    @IBAction func ReplayButton(sender: UIButton) { 
     restGame() 
     didPressClose() 
    } 
    @IBAction func ReturnMainMenu(sender: UIButton) { 
     Data.GameStarted = 1 
     self.dismissViewControllerAnimated(false) { 
      // go back to MainMenuView as the eyes of the user 
      self.presentingViewController.dismissViewControllerAnimated(false, completion: nil); 
     } 
     /* let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("MainScene") as! MainScene 
     self.presentViewController(nextViewController, animated:true, completion:nil)*/ 

    } 
    func restGame(){ 
     Data.score = 0 
     Data.GameHolder = 3 
     Data.GameStarted = 1 
     Data.PlayerLife = 3.0 
     Data.BonusHolder = 30 
     Data.BonusTimer = 0 
    } 
    func didPressClose() 
    { 
     self.self.dismissViewControllerAnimated(true, completion:nil) 
    } 
    override func shouldAutorotate() -> Bool { 
     return false 
    } 

    deinit{ 
     print("GameOverView is being deInitialized."); 

    } 

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

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


} 

Qualche suggerimento?

risposta

38

Che cosa si può fare è lasciare che il GameOverView essere presentata, dopo tutto quando si presentandola la GameViewController è inferiore nella gerarchia, e quindi nel vostro GameOverView eseguire il seguente codice di chiudere sia quando si vuole respingere il GameOverView, come nel seguente modo:

@IBAction func ReturnMainMenu(sender: UIButton) { 
    // save the presenting ViewController 
    var presentingViewController: UIViewController! = self.presentingViewController 

    self.dismissViewControllerAnimated(false) { 
      // go back to MainMenuView as the eyes of the user 
      presentingViewController.dismissViewControllerAnimated(false, completion: nil) 
    } 
} 

il codice di cui sopra devono essere chiamati quando si vuole respingere il GameOverView.

Spero che questo ti aiuti.

+0

non funziona si dà un errore "Getter per 'presentingViewController' con selettore Objective-C conflitti 'presentingViewController' con getter per 'presentingViewController' da '' UIViewController superclasse con lo stesso selettore di Objective-C" i aggiornato il mio post in modo da poter vedere il mio codice per GameOverView – Michel

+0

Prima di tutto, 'var presentandoViewController: UIViewController! = self.presentViewController' al di fuori di una funzione non funziona, devi dichiararlo e poi all'interno di 'viewDidLoad' lo istanziamo. Il tuo problema è che quando dichiari 'presentingViewController' come una proprietà memorizzata,' UIViewController' entra in conflitto con la sua propria 'presentViewViewontroller', soluzione: cambia il nome. Il codice sopra è da chiamare all'interno di una funzione per evitare questo tipo di conflitti. –

+0

Grazie per l'aiuto è tornato a MainMenu ma il GameViewController non è stato rimosso, ma la memoria non è stata rilasciata – Michel

0

Il codice seguente vi porterà al VC principale, Ecco un pezzo di codice provato e testato.

self.view.window!.rootViewController?.dismiss(animated: false, completion: nil) 
Problemi correlati