web-dev-qa-db-fra.com

Comment fermer le ViewController actuel et passer à une autre vue dans Swift

Je suis nouveau sur Swift et je veux savoir comment fermer le contrôleur de vue actuel et passer à une autre vue.

Mon storyboard est le suivant: MainMenuView -> GameViewController -> GameOverView. Je veux ignorer le GameViewController pour accéder au GameOverView, pas au MainMenuView.

J'utilise le code suivant dans mon 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()
}

Dans le GameViewController, j'utilise ce code, mais il ne rejette pas le GameViewController.

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

Voici mon code 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
    }


}

Aucune suggestion?

14
Michel Kansou

Ce que vous pouvez faire est de laisser le GameOverView être présenté, après tout lorsque vous le présentez, le GameViewController est en dessous dans la hiérarchie, puis dans votre GameOverView exécutez le code suivant pour fermez les deux lorsque vous voulez fermer le GameOverView, comme de la manière suivante:

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

Le code ci-dessus doit être appelé lorsque vous souhaitez supprimer le GameOverView.

J'espère que cela vous aidera.

39
Victor Sigler

Le code ci-dessous vous amènera au VC principal, voici un morceau de code éprouvé.

self.view.window!.rootViewController?.dismiss(animated: false, completion: nil)
1
Abhinav Jha