2009-05-05 6 views
1

Je fais une simple barre d'onglets application iPhone. Il dispose de deux onglets, l'une avec un UIWebView et l'autre avec quelques champs de texte pour contenir les paramètres, et un bouton pour enregistrer les paramètres.Application iPhone - Comment une vue peut-elle appeler une méthode dans une autre vue?

Ce que je veux faire est de recharger le UIWebView lorsque l'utilisateur clique sur enregistrer l'onglet Paramètres/vue. Je l'ai déjà enregistré les paramètres, j'ai juste besoin de comprendre comment mettre en appel pour que l'UIWebView s'actualise.

Je suis confus sur la façon dont une vue peut envoyer des messages à une autre vue.

Répondre

4

Ce que je l'ai fait est faire parler entre eux par l'AppDelegate.

Par exemple:

View1 aura une fonction qui fait:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate myFunction]; 

MyAppDelegate a une fonction appelée myFunction qui soit faire quelque chose, ou appelez:

[viewController myViewFunction]; 

Je J'ai mis en place un système assez agréable pour charger plusieurs vues (et naviguer dans les deux sens, comme si elles étaient des écrans différents). Je viens pas pris le temps d'écrire ce et l'envoyer à pushplay.net - mais je vais essayer de le faire dans les prochains jours ...

===

EDIT: D'accord, j'ai posté ce que j'ai. Tous les commentaires seraient appréciés.

http://pushplay.net/blog_detail.php?id=27

Je comprends ce que les commentateurs disent ci-dessous, mais je dois encore voir un exemple qui fonctionne de manière transparente, sur la base ayant plusieurs viewcontrollers besoin de naviguer entre eux.

+0

Merci, ce sens. Assurez-vous de poster ici lorsque vous avez votre message en le montrant en détail. – Greg

+0

Vous ne devriez pas avoir besoin d'utiliser le délégué d'application pour transférer des messages dans d'autres vues. Voilà à quoi servent les contrôleurs de vue. –

+0

Ceci est le bon _kind_ de code, mais vous devriez le faire dans le viewController comme Nathan dit. Essayez de ne pas ajouter plus que nécessaire à l'appDelegate. Il deviendra assez grand juste avec les trucs dont il a besoin. –

5

Le fait que vous utilisez ces deux points de vue à l'intérieur du cadre d'un UITabBarController est sans rapport avec le coeur du problème; à savoir, que vous aimeriez qu'une partie de votre demande soit informée que quelque chose s'est passé dans une autre partie. La façon typique de le faire est avec KVO, ou en utilisant le NSNotificationCenter comme ceci:

// Register interest in finding out when the settings are changed 
[[NSNotificationCenter defaultCenter] addObserver:myWebViewController 
    selector:@selector(refreshWebView:) name:@"settingsSaved" object:nil]; 

// Notify interested parties that the settings have changed 
[[NSNotificationCenter defaultCenter] postNotificationName:@"settingsSaved" object:nil]; 
+0

Juste sauf que je pense que le KVO et les notifications semblent excessives pour ce problème –

1

Cela dépend de la complexité de l'application spécifique et le modèle d'objet dans cette application:

  • Si les vues sont liées et les messages ne sont pertinents que pour les vues, ils peuvent alors envoyer des messages directement les uns aux autres. Par exemple, une vue peut (et devrait) envoyer des messages directement à ses sous-vues et elle peut envoyer des messages directement à son parent. Si elles ne sont pas liées mais affichent des données à propos de la même information, vous devez envoyer des messages via le viewController - c'est exactement la raison pour laquelle vous avez un contrôleur de vue. Si vous avez une application compliquée avec une architecture MVC forte, la communication doit être effectuée indirectement en mettant à jour les objets du modèle et en les cascadant aux vues via leurs viewControllers.

1

Dans ce cas, vous êtes probablement mieux d'avoir votre délégué application attribuer le contrôleur tenant l'affichage Web en tant que délégué de votre autre contrôleur de vue sur le lancement de l'application - regarder dans un protocole pour le rendre propre, mais Pour quelque chose de simple, vous pouvez toujours déclarer le type de délégué en tant que votre vue Web en maintenant le contrôleur de vue.

Les notifications sont également une bonne idée, et il n'y a pas de tâche trop petite pour eux - mais vous devez savoir qu'il est important de se désabonner des notifications dans des endroits comme dealloc. Pour le niveau supérieur d'un contrôleur de vue de la barre d'onglets, cela n'a pas vraiment d'importance.

0

Vous pouvez toujours configurer une variable d'instance dans votre contrôleur d'onglets qui pointe vers la vue Web. Configurez-le en tant qu'IBOutlet, connectez-le dans Interface Builder, puis appelez votre méthode sur la variable d'instance.

.h:

IBOutlet UIWebView *webView; 

@property (nonatomic, retain) UIWebView *webView; 

fichier .m:

@synthesize webView; 

//Then later in your method 
[webView refresh]; //or however you do it 

Cordialement,

Kyle

Questions connexes