Lorsque je rejette un contrôleur de vue modale que je souhaite mettre à jour dans la table, j'utilise le style de présentation sous forme de feuille sur iPad. Les méthodes viewWillAppear
et viewDidAppear
ne fonctionneront
Code de version Swift 3: Dans votre premier contrôleur de vue:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)
}
func loadList(){
//load data here
self.tableView.reloadData()
}
Dans votre deuxième contrôleur de vue:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
Tu peux le faire:
Dans votre contrôleur de tableView:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)
}
func loadList(notification: NSNotification){
//load data here
self.tableView.reloadData()
}
Puis dans l'autre ViewController:
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
La virgule manquante sur cette ligne devrait plutôt être:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:",name:"load", object: nil)
Vous pouvez utiliser NotificationCenter pour mettre à jour votre tableview.
Ajoutez d'abord l'observateur ...
NotificationCenter.default.addObserver(self, selector: #selector(doThisWhenNotify(notification:)), name: NSNotification.Name(rawValue: "load"), object: nil)
func doThisWhenNotify(notification : NSNotification) {
let info = notificatio.userInfo
//update tableview
}
Publier sur un autre ViewController
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil, userInfo: [String : Any])
Je trouve l'approche de la suite plus élégante.
Disons que nous avons ViewControllerA
et un ViewControllerB
. Nous sommes à ViewControllerB
et nous voulons que ViewControllerB
revienne directement à ViewControllerA
et mette à jour la vue tabulaire dans ViewControllerA
.
Dans ViewControllerA
ajoutez l'action suivante dans votre classe ViewController:
@IBAction func unwindToViewControllerA(segue: UIStoryboardSegue) {
DispatchQueue.global(qos: .userInitiated).async {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
Oui, ce code est inséré dans le ViewController du ViewController vers lequel vous voulez revenir!
Maintenant, vous devez créer une séquence de sortie à partir du storyboard de ViewControllerB
(StoryboardB
). Allez-y et ouvrez StoryboardB
et sélectionnez le scénario. Maintenez la touche CTRL enfoncée et faites glisser pour sortir comme suit:
Vous recevrez une liste de ligues parmi lesquelles choisir, y compris celle que nous venons de créer:
Vous devriez maintenant avoir une séquence, cliquez dessus:
Allez dans l'inspecteur et définissez un identifiant unique:
Dans la ViewControllerB
au point où vous souhaitez ignorer et revenir à ViewControllerA
, procédez comme suit (avec l'identifiant défini précédemment dans l'inspecteur):
self.performSegue(withIdentifier: "yourIdHere", sender: self)
Maintenant, chaque fois que vous utilisez le segue pour revenir à ViewControllerA
, le ViewControllerA
mettra immédiatement à jour le TableView.
Une autre solution: override La méthode dismiss(animated:completion:)
de UIViewController
sur le contrôleur de vue qui gère la vue de la table (et présente l’autre sous forme de mode), afin que vous puissiez recharger la table alors:
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: completion)
self.tableView.reloadData()
}
Remarque: Cela devrait fonctionner même si vous appelez la commande "Anime: Completion" sur le contrôleur de vue modal lui-même (une alternative viable), car l'appel est finalement relayé au contrôleur de vue present.
A partir de la documentation de la méthode:
Il est de la responsabilité du contrôleur de la vue présentateur de rejeter le contrôleur de la vue qu’il a présenté. Si vous appelez cette méthode sur le contrôleur de vue présenté lui-même, UIKit demande au contrôleur de vue présentant view de gérer le renvoi.
(c'est moi qui souligne)