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")
}
Je pouvais voir le message println dans la sortie de la console, mais ViewController n'était jamais renvoyé. Quel pourrait être le problème?
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)
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)
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")
}
}
ajoutez cette ligne dans les parenthèses:
self.dismissViewControllerAnimated(true, completion: nil)
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)
Utilisation:
self.dismiss(animated: true, completion: nil)
au lieu de:
self.navigationController.dismissViewControllerAnimated(true, completion: nil)
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é.
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)
}
...
}
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)
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)
}
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.
S'il te plaît, essaie ça, ça marche avec moi.
Second Way - Utilisez - navigationController.popViewControllerAnimated(true)
Meilleure chance ..
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.
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)
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.
Dans Swift 3.
Si vous souhaitez ignorer un contrôleur de vue présenté
self.dismiss(animated: true, completion: nil)
Essaye ça:
@IBAction func close() {
dismiss(animated: true, completion: nil)
}
Ce code écrit en bouton action pour rejeter
@IBAction func cancel(sender: AnyObject) {
dismiss(animated: true, completion: nil)
}