web-dev-qa-db-fra.com

Comment congédier ViewController dans Swift?

J'essaie de rejeter un contrôleur de vue dans Swift en appelant dismissViewController dans un IBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

random image of a segue

Je pouvais voir le message println dans la sortie de la console, mais ViewController n'était jamais renvoyé. Quel pourrait être le problème?

191
rshankar

De votre image, il semble que vous ayez présenté le ViewController en mode Push.

La dismissViewControllerAnimated est utilisée pour fermer ViewControllers qui a présenté en utilisant modal

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)
375
Zoon Nooz

J'ai une solution à votre problème. Veuillez essayer ce code pour fermer le contrôleur de vue si vous présentez la vue en utilisant modal:

Swift 3:

self.dismiss(animated: true, completion: nil)

OR

Si vous présentez la vue en utilisant "Push" segue

self.navigationController?.popViewController(animated: true)
162
satheesh

si vous faites cela, je suppose que vous pourriez ne pas recevoir de message println dans la console,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}
19
BaSha
  1. incorporer la vue que vous souhaitez ignorer dans un NavigationController
  2. ajoutez un bouton Bar avec "Done" comme identifiant
  3. invoquer l'Assistant-éditeur avec le bouton Terminé sélectionné
  4. créer un IBAction pour ce bouton
  5. ajoutez cette ligne dans les parenthèses:

    self.dismissViewControllerAnimated(true, completion: nil)
    
13
LAOMUSIC ARTS

Dans Swift 3.0 à 4.0, il vous suffit de taper ceci dans votre fonction:

self.dismiss(animated: true, completion: nil)

Ou si vous êtes dans un contrôleur de navigation, vous pouvez le "faire apparaître":

self.navigationController?.popViewController(animated: true)
12
Chase McElroy

Utilisation:

self.dismiss(animated: true, completion: nil)

au lieu de:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)
11
jobima

Si vous présentez un contrôleur sans contrôleur de navigation, vous pouvez appeler le code suivant à partir d'une méthode du contrôleur présenté.

self.presentingViewController?.dismiss(animated: true, completion: nil)

Si votre ViewController est présenté sous forme modale, la présentation en option deViewViewController ne sera pas nulle et le code sera exécuté.

7
Peyotle

Sur la base de mon expérience, j'ajoute une méthode pour me rejeter comme extension à UIViewController:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

Ensuite, j'appelle cette méthode pour ignorer le contrôleur de vue dans toute sous-classe UIViewController. Par exemple, dans l'action cancel:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}
6
David.Chu.ca

De Apple documentations :

Le contrôleur de la vue présentateur est responsable de la suppression du contrôleur de la vue qu’il a présenté.

Ainsi, c’est une mauvaise pratique d’invoquer la méthode rejeter de sa part.

Ce que vous devriez faire si vous le présentez en mode modal est:

presentingViewController?.dismiss(animated: true, completion: nil)
5
OhadM

Ne créez pas de séparation entre Annuler ou Terminé vers un autre VC et écrivez uniquement ce code avec vos boutons @IBAction.

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}
4
Fatih

Voici l'un des moyens de rejeter le présent contrôleur de vue et de revenir au contrôleur de vue précédent. Vous pouvez le faire via Storyboard uniquement.

  1. Scénario ouvert
  2. Faites un clic droit sur le bouton Annuler et faites-le glisser vers le contrôleur de vue précédent, où vous souhaitez revenir au contrôleur précédent.
  3. Maintenant, relâchez le clic droit et vous pouvez voir certaines actions qui s'exécutent sur le bouton Annuler
  4. Maintenant, choisissez l'option "popover present" dans la liste
  5. Maintenant, vous pouvez rejeter votre vue actuelle en cliquant sur le bouton Annuler

S'il te plaît, essaie ça, ça marche avec moi.

Second Way - Utilisez - navigationController.popViewControllerAnimated(true)

Meilleure chance ..

3
Chetan Bhalara

Pour référence, sachez que vous pouvez ignorer le mauvais contrôleur de vue. Par exemple, si vous avez une boîte d’alerte ou un modal affiché au-dessus d’un autre modal. (Vous pouvez par exemple avoir une alerte de publication sur Twitter qui s'affiche au-dessus de votre alerte modale actuelle). Dans ce cas, vous devez appeler licencier deux fois ou utiliser une séquence de déroulement.

2
mcfroob

Dans Swift 4.1 et Xcode 9.4.1

Si vous utilisez pushViewController pour présenter le nouveau contrôleur de vue, utilisez cette

self.navigationController?.popViewController(animated: false)
1
iOS

Si vous présentez ViewController de manière modale et souhaitez revenir à ViewController racine, veillez à fermer ce ViewController à présentation modale avant de revenir à ViewController racine, sinon ce ViewController ne sera pas supprimé de la mémoire et ne causera pas de fuites de mémoire.

1
dan

Dans Swift 3.

Si vous souhaitez ignorer un contrôleur de vue présenté

self.dismiss(animated: true, completion: nil)
1
Ramakrishna

Essaye ça:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}
0
cassiodiego

Ce code écrit en bouton action pour rejeter

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }
0
Sai kumar Reddy