2010-05-27 17 views
1

L'application que je suis en train de créer doit afficher un UIToolbar personnalisé partagé pour plusieurs vues (et leurs sous-vues) dans un cadre UITabBarController. Le contenu de la barre d'outils personnalisée est le même pour toutes les vues. J'aimerais pouvoir concevoir la barre d'outils personnalisée en tant que xib et gérer les événements de l'interface utilisateur à partir de sa propre classe de contrôleur (je suppose que je peux sous-classer UIToolbar pour le faire?). De cette façon, je pourrais définir des éléments IBOutlet & IBAction, etc. Ensuite, je pourrais associer cette barre d'outils personnalisée à chacune des vues UITabBarController (et leurs sous-vues). Mais j'ai du mal à savoir si c'est possible - et si oui, comment le faire.Barre d'outils iPhone partagée par plusieurs vues

En particulier, je veux être capable de pousser de nouvelles vues sur des piles de vue UINavigationController qui sont chacune associées aux onglets parentaux UITabBarController. Donc, pour résumer, je veux un:

  • barre d'outils personnalisée
  • partagée par plusieurs vues
  • qui sont gérés par plusieurs contrôleurs de navigation
  • et les contrôleurs de navigation sont associés à différents onglets d'un onglet parent contrôleur de barre

Le contrôleur de barre d'onglets est lancé de manière modale, bien que je ne pense pas que cela soit pertinent.

Quoi qu'il en soit, le contrôleur de barre d'onglets fonctionne, tout comme ses contrôleurs de navigation enfant. J'ai juste un peu de mal à trouver comment persister la barre d'outils partagée pour les différentes sous-vues. Je me contenterais d'une bonne méthode d'implémentation propre au programme ... bien que je préfère la flexibilité de garder le design visuel de la barre d'outils dans un xib. Tout le monde a des suggestions

+0

mise à jour ... J'ai joué autour d'essayer de voir si je peux stocker le contenu du tableau passé à [self setToolbarItems: éléments animés: NO] dans un singleton retenu par mon principal délégué d'application ... mais je Je rencontre des problèmes. Je suis sûr qu'il y a une raison pour laquelle cette idée est idiote.Si je savais réellement ce que je faisais, je suis sûr que ce serait probablement évident pour moi. – codemonkey

Répondre

4

je crois J'ai la "réponse" ... et c'est si simple, je suis plutôt gêné que cela ne m'est pas arrivé avant maintenant. Créez une sous-classe personnalisée de UIViewController, au sein de laquelle vous définissez les attributs de la barre d'outils de UINavigationController (défini comme activé depuis le xib dans IB). Ensuite, à partir des autres vues que vous souhaitez inclure dans cette barre d'outils, vous venez de sous-classer cette classe. Dans mon cas, j'ai nommé une sous-classe ChallengeToolbar de UIViewController, alors je l'ai fait:

UIImage *vaultImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"goldbar" ofType:@"png"]]; 
UISegmentedControl *vaultButtonControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:vaultImage, nil]]; 
vaultButtonControl.segmentedControlStyle = UISegmentedControlStylePlain; 
vaultButtonControl.momentary = YES; 
[vaultButtonControl addTarget:self action:@selector(goNavVault:) forControlEvents:UIControlEventAllEvents]; 
UIBarButtonItem *vaultButton = [[UIBarButtonItem alloc] initWithCustomView:vaultButtonControl]; 
vaultButton.customView.frame = CGRectMake(0,0,40,20); 

UIBarButtonItem *invite = [[UIBarButtonItem alloc] initWithTitle:@"Invite" style:UIBarButtonItemStyleBordered target:self action:@selector(goNavVault:)]; 

UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
NSArray *items = [NSArray arrayWithObjects: invite, flexItem, flexItem, flexItem, vaultButton, nil]; 
[self setToolbarItems:items animated:NO]; 
[vaultButtonControl release]; 
[vaultButton release]; 
[invite release]; 
[flexItem release]; 

... dans la méthode viewDidLoad. Ensuite, à partir de n'importe quelle vue dans laquelle je veux que ma barre d'outils apparaisse, je configure simplement la classe de contrôleur de la vue pour sous-classer ma classe ChallengeToolbar au lieu de UIViewController. DUH!

1

Quelques réflexions initiales.

Vous souhaiterez probablement conserver cette barre d'outils en dehors de la portée de la barre d'onglets et simplement propager les événements qui se produisent depuis la barre d'outils vers la vue à l'écran. En l'état, la barre d'outils gère plusieurs vues et je ne pense pas que vous puissiez faire flotter des composants au-dessus d'une vue particulière à l'intérieur du contrôleur.

Je code généralement mon programme d'interface utilisateur pour que je puisse avoir un contrôle précis, donc je ne peux pas dire à quel point il est facile de gérer cela depuis Interface Builder.

+0

merci d'avoir répondu ... même des commentaires généraux comme celui-ci sont importants pour moi à ce stade. même en sachant que les programmeurs objectifs-c plus expérimentés ne voient pas immédiatement la solution est utile. Je vais trouver plus facile de vivre avec avoir pris quelques jours pour trouver une solution à ce problème si je sais qu'il n'y a pas de solution triviale là-bas dont je ne suis pas au courant. – codemonkey