1

J'essaie d'utiliser la barre d'outils du NavigationController dans mon application. Les toolbarItems de cette barre d'outils sont supposés changer en fonction du contrôleur de vue présenté. C'est très basique. Ce que j'essaie de faire est d'ajouter des boutons personnalisés à la barre d'outils en utilisant la méthode "initWithCustomView:" de UIBarButtonItem. Cependant, le bouton n'apparaîtra pas sur la barre d'outils. Mais si je crée le UIBarButtonItem en utilisant la méthode "initWithTitle:" ou "initWithBarButtonSystemItem:", le bouton apparaît. Par exemple, regardez le code ci-dessous:barre d'outils de uinavigationController avec des éléments personnalisés

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil]; 
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil]; 

NSArray *array = [[NSArray alloc] initWithObjects:item1, item2, nil]; 
[self setToolbarItems:array]; 

Si cela est fait, les boutons s'affichent dans la barre d'outils. Mais, si je devais faire ce qui suit:

UIButton* replyBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal]; 
[replyBtn addTarget:self action:@selector(replyButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
replyBtn.frame = CGRectMake(10, 0, 40, 40); 
UIBarButtonItem *replyButton = [[UIBarButtonItem alloc] initWithCustomView:replyBtn]; 

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil]; 
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil]; 

NSArray *array = [[NSArray alloc] initWithObjects:item1, replyButton, item2, nil]; 
[self setToolbarItems:array]; 

Dans ce code, seul le Item1 et item2 sont affichées dans la barre d'outils. replyButton n'est pas affiché dans la barre d'outils. Il y a un espace vide à l'endroit où le bouton est supposé être.

Si ce même code est utilisé sur une barre d'outils régulière que je crée à la place de la barre d'outils de NavigationController, le bouton apparaît. J'essaye juste d'employer une barre d'outil tout au long de l'application pour avoir la même sensation que l'application de courrier d'Apple fait. La raison pour laquelle j'ai besoin d'utiliser la méthode "initWithCustomView:" est que l'une des icônes est colorée et c'est la seule façon dont elle apparaît colorée sur une barre d'outils normale. Maintenant, j'ai regardé à travers la documentation d'Apple et il n'y a aucune mention de pourquoi la méthode "initWithCustomView:" n'a pas pu être appelée (ou peut-être que je ne pouvais pas le trouver).

Pourriez s'il vous plaît quelqu'un de faire la lumière sur ce sujet pour m'aider à pointer dans la bonne direction. merci d'avance les gars.

+0

ont exactement le même problème. Je me demande pourquoi cela ne fonctionne pas ... Je pourrais aussi avoir besoin d'ajouter une barre d'outils différente avec "ajouter une sous-vue". –

Répondre

1

Je ne vois pas la différence de ce que vous avez essayé, mais il a fini travaillé pour moi, avec ce code:

////////////////////////////////////////////////////////////////////////////////////////////// 
/////>>>> Adding buttons for browsing in the toolbar of the popover's navigation controller/// 
////////////////////////////////////////////////////////////////////////////////////////////// 

//>>>>Create a goBack button  
goBack = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *goBackImage = [UIImage imageNamed:@"back1.png"]; 
[goBack setImage:goBackImage forState:UIControlStateNormal]; 
[goBack addTarget:self action:@selector(goBackClicked:) forControlEvents:UIControlEventTouchUpInside]; 
goBack.frame = CGRectMake(0,0,goBackImage.size.width,goBackImage.size.height); 
//Create a Bar button to hold this button 
UIBarButtonItem *goBackBarButton = [[[UIBarButtonItem alloc] initWithCustomView:goBack] autorelease]; 

UIBarButtonItem *flex1 = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease]; 
UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:nil action:nil] autorelease]; 
NSArray *arrayOfButtons = [[[NSArray alloc] initWithObjects:goBackBarButton, flex1, addButton, nil] autorelease]; 
[self setToolbarItems:arrayOfButtons]; 

Remarque quelques différences par rapport à vous (peut-être c'est où la capture-je? ne suis pas sûr): 1. mes boutons ne sont pas attribués localement dans la méthode, mais dans la classe (vous savez, la propriété, synthétisent, etc.) 2. vôtre

[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal]; 

où m ine est un peu différent

[goBack setImage:goBackImage forState:UIControlStateNormal]; 

Essayez ces petits changements, peut-être cela fonctionnera :)

0

Je parierais que l'élément n'apparaît pas parce que sa vue n'a rien dedans. Etes-vous sûr qu'il y a une image appelée Reply_Message.png dans votre projet? [UIImage imageNamed:@"Reply_Message.png"] pourrait être nil.

+0

Je suis positif à ce sujet. Si je prends le même code exact et que je place ces éléments dans une barre d'outils que je crée, le bouton apparaît. Ce n'est pas le problème à coup sûr. J'ai même essayé un UIButton avec juste un titre, au lieu de l'image, ajoutez cela comme une sous-vue à l'UIBarButtonItem et même cela n'apparaîtra pas. – Bittu

0

Vous pouvez utiliser une barre d'outils dans votre application sans utiliser la barre d'outils des contrôleurs de navigation. Puisque votre code fonctionne avec une barre d'outils non-navigationController, cela pourrait être le moyen le plus facile d'accomplir ce que vous voulez. Dans votre délégué d'application, essayez d'ajouter une barre d'outils à la fenêtre, comme ceci. De cette façon, il est persistant tout au long de l'application. Assurez-vous de considérer un schéma qui vous permettra d'accéder à la barre d'outils pour ajouter/supprimer des boutons, ou masquer/afficher à partir de différents contrôleurs de vue.

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    /////// frame sizes //////// 
    // compensate for the status bar 
    int statusBarHeight = 20; 

    // toolbar 
    int toolbarWidth = window.frame.size.width; 
    int toolbarHeight = 30; // I think standard size is 30 
    int toolbarxOffset = 0; 
    int toolbaryOffset = window.frame.size.height - tHeight; 
    CGRect toolbarFrame = CGRectMake(toolbarxOffset, 
            toolbaryOffset, 
            toolbarWidth, 
            toolbarHeight); 

    /////// toolbar ////////////////////// 
    self.myPersistentToolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame]; 
    [window addSubview:self.myPersistentToolbar]; 
} 
+2

Merci pour votre réponse Drew. J'avais déjà envisagé cette idée. Si j'avais une application qui utilisait le fichier navigationController comme rootViewController, cela aurait pu marcher. Au lieu de cela, j'utilise le lanceur de cette bibliothèque Three20 comme vue racine, avec chaque "sous-application" contenant ses propres paramètres. Certains ont des tabulations, tandis que d'autres ont navigationController ou splitviewController. J'essayais d'éviter d'ajouter quelque chose à la fenêtre elle-même pour cette raison. la solution que je suis venu avec était d'ajouter ma propre barre d'outils à une sous-vue à la vue de navigationController. – Bittu

1

je le même problème. Il s'avère que la barre d'outils pour UINavigationController réinitialise ses éléments chaque fois qu'une nouvelle vue est poussée sur la pile.J'essayais de définir les éléments de la barre d'outils dans la fonction applicationDidFinish, et cela ne fonctionnait pas. Cela a fonctionné une fois que j'ai placé la barre d'outils itms dans la fonction - (void) viewDidAppear du viewController qui était poussé sur la pile de navigation. Il semble donc que si vous souhaitez que le contrôleur de navigation conserve les mêmes éléments de barre d'outils dans l'application, vous devez définir les éléments de la barre d'outils dans chaque vue que vous appuyez sur le contrôleur de navigation après l'affichage.

J'espère que cela aide!