web-dev-qa-db-fra.com

Recharger un ViewController

J'ai un contrôleur de vue affichant des informations (pas des vues de table).

J'ai un appel de mise à jour à un serveur distant qui remplit ma base de données. Je voudrais recharger complètement mon ViewController une fois l'appel de mise à jour terminé.

Que devrais-je faire?

37
Tiago Veloso

Vous n'avez vraiment pas besoin de faire:

[self.view setNeedsDisplay];

Honnêtement, je pense qu’il s’agit du type de solution "espérons, le meilleur", dans ce cas . Il existe plusieurs approches pour mettre à jour votre UIViews:

  1. KVO
  2. Les notifications
  3. Délégation

Chacun a ses avantages et ses inconvénients. En fonction de ce que vous mettez à jour et du type de "connexion" que vous avez entre votre couche métier (la connectivité du serveur) et la UIViewController, je peux en recommander une qui convienne à vos besoins.

17
Rui Peres

si vous connaissez votre base de données, hasbee a été mise à jour et que vous souhaitez simplement actualiser viewcontrolle (ce qui est également le cas). je n'ai trouvé aucune autre solution mais ce que j'ai fait est lorsque ma base de données a été mise à jour, j'ai appelé 

[self viewDidLoad];

encore une fois, et cela a fonctionné . Rappelez-vous que si vous substituez d'autres viewWillAppear ou loadView, appelez-les aussi dans le même ordre .. comme.

[self viewDidLoad]; [vue de soi apparaîtra: OUI];

mais je pense qu'il devrait y avoir une solution plus spécifique comme le bouton de rafraîchissement dans le navigateur . si quelqu'un a plz upload anse

24
Moaz Saeed

Si vous souhaitez recharger un ViewController initialement chargé à partir d'un XIB, vous pouvez utiliser la prochaine extension UIViewController:

extension UIViewController {
    func reloadViewFromNib() {
        let parent = view.superview
        view.removeFromSuperview()
        view = nil
        parent?.addSubview(view) // This line causes the view to be reloaded 
    }
}
10
juancazalla

Essayez ceci, vous devez appeler les deux méthodes pour recharger la vue, car celle-ci fonctionne pour moi

-Objectif c

[self viewDidLoad]; 
[self viewWillAppear:YES];

-Rapide

self.viewDidLoad()
self.viewWillAppear(true)
4
Patel Jigar

Mettez à jour les données ... changez les titres des boutons ... quels que soient les éléments à mettre à jour ..

alors il suffit d'appeler 

[self.view setNeedsDisplay];
2
Shubhank

Dirigez-vous à nouveau vers votre ViewController. dans ma situation, [self.view setNeedsDisplay]; et [self viewDidLoad]; [self viewWillAppear:YES]; ne fonctionnent pas, mais la méthode ci-dessous a fonctionné.

En objectif c

UIStoryboard *MyStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil ];
UIViewController *vc = [MyStoryboard instantiateViewControllerWithIdentifier:@"ViewControllerStoryBoardID"];
[self presentViewController:vc animated:YES completion:nil];

Rapide:

let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerStoryBoardID")   
self.presentViewController(secondViewController, animated: true, completion: nil)
1
user4410354

Il n'est pas conseillé d'appeler ViewDidLoad ou ViewWillAppear par vous-même.

Dans ViewDidLoad, incluez une fonction loadData () pour préparer les données. Ceci est exécuté lors de l'exécution initiale.

Lorsque vous souhaitez recharger, appelez à nouveau loadData () pour obtenir les données du modèle. Dans un appel tableView, reloadData () ou dans une vue normale, setNeedsDisplay ().

1
Vincent

Réinitialiser le contrôleur de vue

YourViewController *vc = [[YourViewController alloc] initWithNibName:@"YourViewControllerIpad" bundle:nil];
[self.navigationController vc animated:NO];
0
Muhammad Aamir Ali