2010-01-27 4 views
1

Je voudrais exécuter le code [tableView reloadData], sauf que je veux l'appeler d'une classe séparée au contrôleur de vue dans lequel je veux recharger les données.iphone sdk - reload tableview data - d'une classe séparée

(Remarque: S'il y a quelque chose de plus efficace pour recharger une tableview que reloadData, chime in).

Dites que l'affichage que je veux recharger est 'RootViewController', et je suis actuellement dans 'DetailViewController', que dois-je faire pour le faire fonctionner.

Ma meilleure tentative en ce moment est [RootViewController.tableView reloadData], mais ce n'est pas correct. (j'obtiens l'erreur: attendu « : »... Avant jeton

Cordialement, @norskben

Répondre

9

Vous pouvez utiliser des notifications ou un protocole.

notifications Utilisation:

poste une notification juste après avoir terminé l'enregistrement des données et avant le retour de la méthode. Quelque chose comme ceci:

// post-notification [[NSNotificationCenter defaultCenter] postNotificationName: @ Objet "DataSaved": nil];

Dans le contrôleur de manipulation de la table, mettre en œuvre

- (void) dataSaved:(NSNotification *)notification{ 

    [self.tableView reloadData]; 

} 

et dans sa méthode viewDidLoad ajoutez le code suivant pour vous inscrire pour les notifications:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                selector:@selector(dataSaved:) 
                                                 name:@"DataSaved" object:nil]; 

enfin, unregister dans la méthode dealloc ajoutant

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

En utilisant un protocole:

Commencez à créer un protocole avec un rappel que votre contrôleur précédent peut utiliser.

@protocol dataSavedDelegate 
-(void)dataSaved; 
@end 

une fois que vous avez terminé l'enregistrement des données:

[(id<dataSavedDelegate>)object dataSaved]; 

maintenant, dans votre contrôleur précédent vous manipulez la méthode déléguée: dans la méthode dataSaved() vous rechargez votre table.

1

Vous avez besoin d'une référence à votre instance de RootViewController dans DetailViewController Déclarer une propriété dans DetailViewController et quand vous instanciez votre DetailViewController (de le RootViewController, je suppose), il a mis quelque chose comme

// in RootViewController.m 
detailController.rootController = self; 
[self.navigationController pushViewController:... 

Ensuite, vous pouvez accéder au contrôleur racine du contrôleur de détail:

[self.rootController.tableView reloadData]; 

Une autre méthode consiste à publier un NSNotification personnalisé dans DetailViewController lorsque vous souhaitez que le RootController soit rechargé et que RootController soit à l'écoute de la notification.

Une autre méthode consiste à recharger la table uniquement lorsque l'utilisateur revient au contrôleur racine (dans la méthode viewWillAppear: de RootViewController), car pourquoi recharger une table qui n'est même pas à l'écran?