[Résolu] Plusieurs boutons dans une navbar

busterTheobusterTheo Membre
avril 2015 modifié dans API UIKit #1

Bonjour à  tous,


après plusieurs heures à  chercher et transpirer, je reviens pour boire un coup d;-)


 


Voilà , pour rester simple, j'ai besoin (En Swift - pas en objectiveC) de placer plusieurs boutons dans ma barre de nav (en haut de l'écran), mais pas le leftButton et le rightButton, mais deux boutons à  gauche et trois à  droite (par ex.)


 


Je sais le faire dans une toolBar en bas de l'écran, comme sur cette appli apple que l'on peut télécharger là .


 


https://developer.apple.com/library/ios/samplecode/UICatalog/Listings/Swift_UICatalog_CustomToolbarViewController_swift.html



let toolbarButtonItems = [
customImageBarButtonItem,
flexibleSpaceBarButtonItem,
customBarButtonItem
]
toolbar.setItems(toolbarButtonItems, animated: true)

J'ai tout essayé, une toolBar dans une navBar, des boutons dans la navBar - dans le storyBoard, en code. Impossible, et je sais qu'il existe plein d'applis avec plusieurs boutons en haut de l'écran.


 


L'idéal, pour moi, est de le faire en code. J'ai déjà  mis un bouton qui fonctionne, mais évidemment sur le leftButton. Mais ensuite, je bloque.


 


Voilà  un bout de code :



self.navigationItem.setHidesBackButton(true, animated: false)

var newPatientsButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "patientsButton.png"), style: .Plain, target: self, action: "lanceTogglePatients")
newPatientsButton.tintColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

self.navigationItem.leftBarButtonItem = newPatientsButton

Merci d'avance.


Réponses

  • tu mets tes boutons dans une array, et tu donne l'array à  la navbar


     


    En obj-c ca donne un truc comme ca, mais ca doit être proche en swift



    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *btnFlexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:btnFlexibleSpace];

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
      target:self
      action:@selector(dismissModalView)];

    [barItems addObject:barButtonItem];

    [toolBar setItems:barItems animated:YES];
  • jpimbertjpimbert Membre
    avril 2015 modifié #3

    Je pense que c'est tout simplement pas prévu pour.


    La propriété item d'une barre de navigation ne fonctionne pas du tout comme celle d'une barre d'outils.


     


    Le plus simple à  mon avis est d'ajouter une barre d'outil.



  • items


     Property



    An array of navigation items managed by the navigation bar.





    Declaration

    SWIFT


    var items: [AnyObject]!




    OBJECTIVE-C


    @property(nonatomic, copy) NSArray *items





     






     





  •  


     


    You can use this method to update or replace the navigation items in the stack without pushing or popping each item explicitly. In addition, this method lets you update the stack without animating the changes, which might be appropriate at launch time when you want to restore the state of the navigation stack to some previous state

     


    C'est ce que j'appelle un fonctionnement différent. items d'une barre de navigation sert à  remplacer toute la pile des contrôleurs qui ont été poussés, pas à  ajouter des boutons dans la barre.


  • ah oui merde, pardon !


  • samirsamir Membre
    avril 2015 modifié #7

    Hello,


     


    Dans ton controller ( UIViewController ):



    self.navigationItem.rightBarButtonItems = ...

    https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationItem_Class/



    @property(nonatomic,copy) NSArray *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
    @property(nonatomic,copy) NSArray *rightBarButtonItems NS_AVAILABLE_IOS(5_0);

  • busterTheobusterTheo Membre
    avril 2015 modifié #8

    Merci pour vos réponses,


    J'ai essayé avec le lien apple (setItems - items), et j'avoue que je n'y comprend pas grand chose.


    J'ai cette erreur :


     



     


    fatal error: Array index out of range



     


    Voilà  mon code en vrac.


    J'ai essayé en déclarant et sans déclarer items. Et aussi en array de UIButtonItem. Et c'est pareil.



    var navBar: UINavigationBar!

    var items = [AnyObject]()

    et pour la config. :



    var newPatientsButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "patientsButton.png"), style: .Plain, target: self, action: "lanceTogglePatients")
    newPatientsButton.tintColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    items[0] = newPatientsButton

    var addPatientsButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "addButton.png"), style: .Plain, target: self, action: "")
    addPatientsButton.tintColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    items[1] = newPatientsButton

    self.navBar.setItems([items], animated: false)

    Sans quoi, j'ai trouvé ça, je ne sais pas ce que ça vaut, en plus c'est en objectiveC.


    http://osmorphis.blogspot.fr/2009/05/multiple-buttons-on-navigation-bar.html


     


    Il balance une toolBar dans le leftButton !!!


  • Ah, je n'avais pas vu vos autres réponses.


     


    Ok, Samir, je crois que ça, c'est le bon truc.


     


    Merci, j'essaie...


  • samirsamir Membre
    avril 2015 modifié #10
    Il faut accéder au navigationItem de ton ViewController et non pas ma navigationBar.
     
    Voici un exemple de mon code en Objective C :
     
    Le self ici correspond à  mon UIViewController et non pas la UINavigationBar.
    - (UIBarButtonItem*)backLeftMenuBarButton
    {
        if (_backLeftMenuBarButton) return _backLeftMenuBarButton;
        UIImage *image = [UIImage imageNamed:@backLeftMenuButton];
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, image.size.width, 44./*image.size.height*/)];

        [button setImage:image forState:UIControlStateNormal];
        [button addTarget:self action:@selector(openBackLeftMenuBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        _backLeftMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:button];
        return _backLeftMenuBarButton;
    }


    - (UIBarButtonItem*)logoutBarButton
    {
        if (_logoutBarButton) return _logoutBarButton;
        UIImage *image = [UIImage imageNamed:@logoutButton];
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 25., 44./*image.size.height*/)];
        
        [button setImage:image forState:UIControlStateNormal];
        [button addTarget:self action:@selector(logoutBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];
         _logoutBarButton = [[UIBarButtonItem alloc] initWithCustomView:button];
        return _logoutBarButton;
    }



     self.navigationItem.rightBarButtonItems = @[;self.backRightMenuBarButton, self.logoutBarButton];


  • Sans quoi, j'ai trouvé ça, je ne sais pas ce que ça vaut, en plus c'est en objectiveC.


    http://osmorphis.blogspot.fr/2009/05/multiple-buttons-on-navigation-bar.html


     


    Il balance une toolBar dans le leftButton !!!




     


     


    Je pense que tout le monde est d'accord. Si on veut plus de 2 boutons dans une Nav Bar il faut passer par une Tool Bar.

  • busterTheobusterTheo Membre
    avril 2015 modifié #12

    Ben, ça marche nickel avec le code de Samir / Apple


    https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationItem_Class/#//apple_ref/occ/instp/UINavigationItem/leftBarButtonItems


     



    var leftBarButtonItems: [AnyObject]?



     


    Et je vais pouvoir faire pareil à  droite, pour trois boutons. Trop cool.


     


    Encore merci Samir.


     


    Je ne comprend pas pourquoi je n'arrive pas à  trouver cette property par moi-même, et encore plus, pourquoi je ne trouve que des trucs compliqués qui ne fonctionnent pas. Je pense que j'ai du mal à  lire la doc apple, surtout en anglais. Ils ne donnent jamais d'exemple, c'est dommage.


     


    Voici le code qui fonctionne.



    var newPatientsButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "patientsButton.png"), style: .Plain, target: self, action: "lanceTogglePatients")
    newPatientsButton.tintColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

    var addPatientsButton: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "addButton.png"), style: .Plain, target: self, action: "addPatientsVide")
    addPatientsButton.tintColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

    self.navigationItem.leftBarButtonItems = [addPatientsButton,newPatientsButton]

    En tout cas merci à  vous tous, et désolé pour le dérangement.


     


    De toutes façon, je reviendrais boire un coup avec vous :p


     


    Je vais mettre résolu.


Connectez-vous ou Inscrivez-vous pour répondre.