web-dev-qa-db-fra.com

Comment recharger une table depuis un autre contrôleur de vue dans swift

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

30
Suneet Tipirneni

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)
43
mriaz0011

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)
66
Sebastian

La virgule manquante sur cette ligne devrait plutôt être:

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:",name:"load", object: nil)
2
kauai

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])
0
Deep

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:

enter image description here

Vous recevrez une liste de ligues parmi lesquelles choisir, y compris celle que nous venons de créer:

enter image description here

Vous devriez maintenant avoir une séquence, cliquez dessus:

enter image description here

Allez dans l'inspecteur et définissez un identifiant unique: enter image description here

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.

0
Rafael

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)

0
Nicolas Miari