2015-08-11 9 views
13

Ich bin neu bei Swift und ich möchte wissen, wie man den aktuellen View-Controller abstellt und zu einer anderen Ansicht geht.Wie man den aktuellen ViewController abstellt und zu einem anderen View in Swift geht

Mein Storyboard ist wie folgt: MainMenuView -> GameViewController -> GameOverView. Ich möchte den GameViewController schließen, um zum GameOverView zu gelangen, nicht zum MainMenuView.

Ich verwende den folgenden Code in meinem 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() 
} 

Im GameViewController ich diesen Code verwenden, aber es nicht die GameViewController entlassen.

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

Dies ist mein GameOverView Code:

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 
    } 


} 

Irgendwelche Vorschläge?

Antwort

38

Was können Sie tun, lassen die GameOverView präsentiert werden, doch wenn Sie es am GameViewController präsentiert unter in der Hierarchie, und dann in Ihrem GameOverView den folgenden Code ausführen beide zu schließen, wenn Sie die GameOverView entlassen wollen, wie auf folgende Weise:

@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) 
    } 
} 

der obige Code müssen aufgerufen werden, wenn Sie die GameOverView entlassen wollen.

Ich hoffe, das hilft Ihnen.

+0

es funktioniert nicht ein Fehler „Getter für‚presentingViewController‘mit Objective-C-Selektor‚presentingViewController‘Konflikte mit Getter für‚presentingViewController‘von Super‚UIViewController‘mit dem gleichen Objective-C-Selektor“ i geben Mein Beitrag wurde aktualisiert, so dass Sie meinen Code für GameOverView sehen können. – Michel

+0

Zuerst, 'var presentingViewController: UIViewController! = self.presentViewController 'außerhalb einer Funktion funktioniert nicht, Sie müssen es deklarieren und dann in Ihrem' viewDidLoad' instanziieren. Ihr Problem besteht darin, dass, wenn Sie 'presentingViewController' als gespeicherte Eigenschaft deklarieren, der' UIViewController' Konflikte mit seiner eigenen 'presentingViewController'-Lösung verursacht: Ändern Sie den Namen. Der obige Code soll innerhalb einer Funktion aufgerufen werden, um diese Art von Konflikten zu vermeiden. –

+0

Danke für die Hilfe, die es auf MainMenu zurück, aber der GameViewController ist noch nicht entlassen, der Speicher wurde nicht freigegeben – Michel

0

Der folgende Code bringt Sie zum Haupt-VC, hier ist ein bewährter Code.

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