0

EDIT 2: J'ai maintenant résolu ce problème. Je mettais une image d'arrière-plan personnalisé pour mon UINavigationBar comme ceci:L'UIToolbar personnalisé dans le fichier rightBarButtonItem de UINavigationController disparaît lorsque vous revenez à l'affichage

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)]; 
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]]; 
[navBar addSubview:imgView]; 
[navBar sendSubviewToBack:imgView]; 
[imgView release]; 

Ce qui était très bien pour le premier contrôleur de vue sur la vue pile du contrôleur du UINavigationController, mais toutes les vues sous faisaient ce code exécuté à nouveau et placer la commande fond à l'avant.

Le Fix: Retirez simplement tout votre code pour l'arrière-plan personnalisé sur le contrôleur de navigation, puis étendez la classe de UINavigationBar de la manière suivante:

Créer un nouveau fichier .h/.m appelé UINavigationBar + CustomImage. Définir le code .h:

@interface UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect; 
@end 

Et le .M:

#import "UINavigationBar+CustomImage.h" 

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"NavigationBarBackground.png"]; 
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 
@end 

Et le tour est joué! Tout fonctionne bien maintenant.

--- FIN EDIT 2 ---

J'ai un UINavigationController, qui fore vers le bas comme si:

HOMEPAGE > DETAIL PAGE > MAP VIEW 

La PAGE DETAIL ajoute une UIToolbar personnalisée (avec trois boutons) pour le rightBarButtonItem dans les viewDidLoad comme ceci:

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 1.0, 157.0, 44.1)]; 
[imgView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NavigationBarBackground" ofType:@"png"]]]; 
[tools addSubview:imgView]; 
[tools sendSubviewToBack:imgView]; 
[tools setTintColor:[UIColor colorWithRed:127/255.0 green:184/255.0 blue:72/255.0 alpha:1.0]]; 
[imgView release]; 

NSMutableArray* buttons = [[NSMutableArray alloc] initWithCapacity:3]; 

UIBarButtonItem* bi = [[UIBarButtonItem alloc] initWithTitle:@"Filter" style:UIBarButtonItemStyleBordered target:self action:NULL]; 

[buttons addObject:bi]; 
[bi release]; 

bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Map.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(showMap:)]; 

[buttons addObject:bi]; 
[bi release]; 

bi = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Favourite.png"] style:UIBarButtonItemStyleBordered target:self action:NULL]; 
[buttons addObject:bi]; 
[bi release]; 

[tools setItems:buttons animated:NO]; 

[buttons release]; 

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:tools]; 

Cette affiche parfaitement lors de l'affichage de la page DETAIL VIEW, et quand je accédez à MAP VIEW, l'UIToolbar personnalisé disparaît (comme prévu). Toutefois, lorsque vous revenez à la vue DETAIL, le port UIToolbar personnalisé n'est plus visible. Il est là, cependant, car je peux toujours appuyer sur la zone où le bouton «Carte» devrait être, et cela me ramène à la vue de la carte.

Savez-vous comment je peux afficher à nouveau cet UIToolbar lorsque je reviens à la vue DETAIL?

J'ai essayé de reconstruire l'UIToolbar personnalisé dans viewWillAppear, qui a exactement les mêmes effets que ci-dessus.

EDIT - Cela fonctionne si je mets le code qui construit l'UIToolbar personnalisé dans la méthode viewDidAppear. Cependant, je n'aime pas cette solution, car la vue revient en arrière, puis le rightBarButtonItem personnalisé apparaît. Cela a-t-il quelque chose à voir avec le fait que le contrôleur de navigation n'est pas initialisé avant que la page ne soit affichée?

Répondre

1

Si cela fonctionne dans viewDidAppear, vous pouvez essayer viewWillAppear. En général, je n'ai jamais vu un ensemble UIToolbar en tant que UIBarButtonItem, donc je ne m'attendrais pas nécessairement à un comportement standard. Dites-moi comment ça se passe.

+0

nope viewWillAppear ne fonctionne pas - la barre d'outils personnalisée est présente, mais invisible. Si je tape où les boutons ont été affichés, la fonctionnalité fonctionne toujours (c'est-à-dire que les méthodes sont toujours appelées). – a1phanumeric

+0

étrange. peut-être sur viewWillAppear vous pourriez appeler setNeedsDisplay sur la barre d'outils ... ou même envisager de l'ajouter dans viewWillAppear et de le supprimer dans viewWillDisappear. – kevboh

0

API d'interface utilisateur d'Apple échouent souvent de manière inhabituelle lorsque vous essayez de faire quelque chose même un peu inhabituel (même des choses qui devraient travail), et en essayant d'insérer un UIToolbar dans un rightBarButtonItem tombe définitivement dans ma définition de « inhabituel ».

Ce que vous devriez vraiment faire est de cacher la barre de navigation et d'ajouter l'UIToolbar comme une sous-vue de la vue principale de votre contrôleur de vue. Vous pouvez également éviter complètement UIToolbar et implémenter les boutons vous-même dans une vue personnalisée.