2010-04-22 10 views
0

J'utilise un UINavigationController pour passer d'une vue à l'autre. Ce que je voudrais, c'est que chaque vue ait la possibilité de contrôler quand elle est permutée pour une autre vue en ayant des boutons dans la vue. Tous les exemples que j'ai vus jusqu'ici ont placé des boutons sur une barre d'outils, qui est située sur la vue racine contenant le contrôleur Switch View plutôt que les vues, eux-mêmes. Est-il possible de faire ce que je veux? Je n'arrive pas à comprendre comment relier la connexion au UINavigationController. Je rencontre des difficultés à le faire, alors n'hésitez pas à me contacter si vous avez besoin de plus de précisions.iPhone: Commutation des vues depuis le contrôleur racine externe

Répondre

2

En savoir plus sur délégués. Les délégués sont une méthode courante pour signaler des choses d'objets à leurs «parents» ou à tout autre objet.

Vous devriez avoir une propriété "delegate" (on peut vraiment l'appeler n'importe quoi, c'est juste une convention) sur vos vues enfants. Vous pouvez avoir des boutons dans vos vues enfant.

Vous déclarez le délégué comme ceci:

interface ChildView : UIViewController { 
    id delegate; 
} 

@property (assign) id delegate; 

implementation ChildView 

@synthesize delegate; 

Ensuite, lorsque vous configurez votre point de vue de l'enfant à l'intérieur de votre UINavigationController, vous faites:

ChildView *childView = [[ChildView alloc] init...] 
childView.delegate = self; 

l'intérieur de votre vue enfant, vous avez un bouton méthode:

- (IBAction) didPressButton:(id)sender { 
    [self.delegate didPressButtonToSwapView]; 
} 

À l'intérieur de votre UINavigationController, vous avez une méthode:

- (void) didPressButtonToSwapView { 
    [self popViewController]; // use the right names, I made these up :) 
    [self pushAnotherViewController]; 
} 

Vous devriez également lire sur des protocoles qui rendrait le code ci-dessus plus robuste et vous aiderait à vous assurer que vous appelez uniquement les bonnes méthodes sur délégué, mais je ne voulais pas compliquer cet exemple.

EDIT: oui, le moyen le plus propre de se débarrasser de l'avertissement est d'utiliser un protocole. Il suffit de mettre cela dans un fichier .h séparé:

@protocol SwitchingDelegate 
- (void) didPressButtonToSwapView; 
@end 

Inclure cet .h dans l'en-tête UINavController et prononcez le UINavController implémente le protocole:

@interface MyNav: UINavController <SwitchingDelegate> { ... 

Mettre en oeuvre la méthode dans la mise en œuvre (vous n pas besoin de rien de plus dans l'interface).

Dans votre ChildView, dire que le délégué doit mettre en œuvre le protocole: changer toutes les déclarations à:

id<SwitchingDelegate> delegate; 

Le compilateur vous aide ensuite en vérifiant si le délégué des objets mettent réellement en œuvre le protocole. Vous ne devriez recevoir aucun avertissement lorsque vous avez terminé tout cela correctement.

+0

Merci pour la réponse. Je pense vraiment que c'est sur la bonne voie, mais je reçois un avertissement sur [self.delegate didPressButtonToSwapView] parce que la méthode est introuvable. Ma vue doit-elle implémenter un protocole en commun avec UINavigationController? Merci encore ... – senfo

+0

Il existe d'autres façons de se débarrasser de l'avertissement, mais le plus propre est de faire un protocole. J'ai ajouté quelques informations sur comment feriez-vous le protocole. – Jaanus

+0

Cela a fonctionné parfait.Merci beaucoup pour votre aide. J'ai appris quelque chose de nouveau sur les protocoles. Ils diffèrent légèrement des interfaces C#, auxquelles je suis habitué. – senfo

Questions connexes