2009-07-03 7 views
12

J'ai une barre d'outils avec différents boutons d'image, créée dans Interface Builder. Je voudrais pouvoir remplacer par programme un des boutons avec un indicateur d'activité lorsqu'il est pressé, puis remettre le bouton d'origine mais changer sa couleur du blanc au jaune lorsque l'activité se termine. Est-ce possible avec une barre d'outils construite par IB ou est-ce que je dois regarder la construction de toute la barre d'outils par programmation et de vues personnalisées?Comment remplacer par programme les éléments UIToolBar intégrés IB

Répondre

26

Voici un exemple de ce que je l'ai fait dans une situation similaire. Je voulais construire la barre d'outils en utilisant Interface Builder mais basculer l'un des BarButtonItems selon qu'il était "vérifié" ou non. Dans cet exemple, il y a quelques éléments clés à noter. Les 2 variables membres suivantes sont définies pour la classe dans le fichier d'en-tête:

NSMutableArray *toolbarItems; 
IBOutlet UIToolbar *toolbar; 
NSUInteger checkUncheckIndex; 

Quand je veux mettre à jour l'état vérifié, j'appelle cette fonction ... S'il vous plaît noter qu'il ya un sélecteur défini appelé checkUncheckClicked qui est appelé lorsque le bouton particulier de l'UIToolbar est cliqué. Et le UIToolbar est mis en place comme un IBOutlet à la barre d'outils.Alternativement, vous pouvez raccorder UIBarButtonItem en tant que prise de sortie et l'utiliser comme logique pour identifier l'index du bouton, ou d'ailleurs, vous pouvez coder l'index du bouton si les choses ne changent pas au fil du temps. Enfin, check.png et unchecked.png alternent entre cela est inclus dans le projet.

- (void)updateBarButtonItemChecked:(BOOL)checked { 
    if (toolbarItems == nil) { 
     toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain]; 
     checkUncheckIndex = -1; 

     for (NSUInteger i = 0; i < [toolbarItems count]; i++) { 
      UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i]; 
      if (barButtonItem.action == @selector(checkUncheckClicked)) { 
       favoriteIndex = i; 
       break; 
      } 
     } 
    } 

    if (checkUncheckIndex != -1) { 
     UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                      style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease]; 
     [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem]; 

     toolbar.items = toolbarItems; 
    } 
} 

Et bien sûr, toolbarItems et la barre d'outils devraient être libérés dans votre dealloc pour la classe.

Espérons que cela aide!

1

Je pense que cela devrait être possible. Vous pouvez soit essayer de créer un IBOutlet pour ce bouton spécifique dans votre classe ViewController, et connecter le bouton de IB à cette prise, ou vous pouvez utiliser la propriété items de cette instance de UIToolbar (vous avez une référence à cela, n'est-ce pas ?) et recherchez l'élément approprié, créez un nouvel objet NSArray avec les éléments modifiés et définissez-le sur cette propriété toolbar.items.

HTH

+0

très utile, merci. Je vais essayer cela et vous laisser savoir comment ça se passe. – frankodwyer

2

Voici l'approche je Il semblait beaucoup plus simple à gérer la barre d'outils entièrement programatically si ....

Dans votre contrôleur de vue 1 ou plusieurs déclarer ensembles d'éléments UIBarButtonItem comme Les éléments de propriété déclarent et connectent également la barre d'outils en tant que propriété UIToolbar. Déclare également 1 ou plusieurs tableaux pour contenir les éléments.

Dans la mise en œuvre Dans viewDidLoad alloc et définissez vos UIBarButtonItems par exemple

 playButton = [[UIBarButtonItem alloc] 
     initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)]; 

sont déclarés comme celui-ci

flexButton1 =[[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil]; 

boutons souples (pour l'alignement, etc.) Il y a plusieurs initMethods pour gérer les différents types de boutons support de barres d'outils. Tous suivent une syntaxe similaire à celle ci-dessus. À noter, les paramètres de cible et d'action. Cible: serait normalement auto, l'action est le nom de la fonction que le bouton devrait déclencher. Après avoir alloué vos UIBarButtons, ajoutez-les à un tableau en utilisant initWithObjects.

Puis assignez les boutons de la barre d'outils que vous appelleriez

[toolbar setItems:<array name>]; 

Ne pas oublier de dealloc vos UIBarButtons et les tableaux à la fin de votre code.

Espérons que cela aide. Si vous avez besoin de plus de code, faites le moi savoir.

Rich D.

0

Une note à ce sujet - la barre d'outils supprimera toute couleur dans vos icônes, de sorte que vous ne serez toujours pas en mesure de le rendre jaune. Vous devrez changer la forme de l'image pour indiquer "on" à la place.

Vous pouvez également charger vos BarButtonItems avec UIButtons (utiliser initWithCustomView) et définir l'image du bouton de manière appropriée.

HTH

0

Essayez:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb { 
    NSMutableArray *newItems = [tb.items mutableCopy]; 
    UIBarButtonItem *old = [newItems objectAtIndex:1], 
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action]; 

    [newItems replaceObjectAtIndex:1 withObject:titled]; 
    tb.items = newItems; 

    [titled release]; 
} 
+1

newItems fuit pendant que vous faites une copie. Vous devriez le libérer après le "tb.items = newItems;" appel, car la barre d'outils le conservera tout seul. – Kalle

1

Swift

Beaucoup a changé depuis ces réponses ont été publiées. Voici une solution Swift 2.0.

Peu importe comment le UIBarButtonItem original que vous remplacez a été créé par programmation. Tout ce dont vous avez besoin est la prise UIToolbar. Pour remplacer, par exemple, le 2ème élément à partir de la gauche, faites ceci:

var toolbarItems = self.toolbar.items 
let newItem = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "play") 
toolbarItems![1] = newItem 
self.toolbar.setItems(toolbarItems, animated: true) 
2

Swift a un moyen beaucoup plus facile. Dans mon cas, je suis en train de changer le bouton de lecture avec le bouton de pause à chaque toucher.

@IBAction func playandPause(sender: UIBarButtonItem) { // Here we are creating an outlet. Hook this up to the bar button item. 
    for (index, button) in toolbarItems!.enumerate() { // Enumerating through all the buttons 
     if button === sender { // === operator is used to check if the two objects are the exact same instance in memory. 
      var barButtonItem: UIBarButtonItem! 
      if mediaplayer.playing { 
       mediaplayer.pause() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Play, target: self, action: #selector(playandPause(_:))) 
      }else { 
       mediaplayer.play() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Pause, target: self, action: #selector(playandPause(_:))) 
      } 
      toolbarItems![index] = barButtonItem // Replace the old item with the new item. 
      break // Break once we have found the button as it is unnecessary to complete the rest of the loop 
     } 
    } 
} 
+0

Bonne solution! Bien que l'étape self.toolbar.setItems (toolbarItems, animated: true) soit manquante et sans elle, je crains que cela ne fonctionne pas. –

0

Pour la barre d'outils entière que vous avez créé dans IB (c'est-à-dire, non pas les éléments de la barre d'outils individuels), créer un IBOutlet:

@IBOutlet weak var toolbarThatYouMade: UIToolbar! 

Ceci est un tableau d'éléments de la barre d'outils individuels, afin vous accéder au membre de gauche (par exemple) avec un indice [0]:

toolbarThatYouMade.items![0].image = UIImage(named: "New Image") 

Ce code suppose que vous avez une image nommée « nouvelle image » dans vos actifs.

Vous pouvez ensuite déclencher un changement d'image pour un élément de la barre d'outils sans avoir à accéder lui-même à cet élément spécifique; par exemple, si vous utilisez cela pour quelque chose comme un lecteur multimédia, vous pouvez afficher les images pause/lecture de:
a) le bouton Pause/Lecture lui-même,
b) le bouton Stop,
c) lorsque vous êtes averti d'un changement d'état du joueur,
ou
d) autre chose entièrement. (Soyez courageux! Soyez audacieux! Soyez quelque chose d'autre qui commence par «b»!)

+0

Merci pour le formatage @ phiter-fernandes. (J'espère que je l'ai fait correctement.) – clyrinkpress

Questions connexes