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
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!
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
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.
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
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];
}
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
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)
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
}
}
}
Bonne solution! Bien que l'étape self.toolbar.setItems (toolbarItems, animated: true) soit manquante et sans elle, je crains que cela ne fonctionne pas. –
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»!)
Merci pour le formatage @ phiter-fernandes. (J'espère que je l'ai fait correctement.) – clyrinkpress
- 1. Remplacer UINavigation par UIToolbar?
- 2. Comment créer des éléments UIToolbar non blancs?
- 3. UIToolBar - désactiver les boutons
- 4. Comment trouver et remplacer par programme dans ENTIER Word document
- 5. Existe-t-il un moyen de déterminer par programme les tailles appropriées pour les contrôles intégrés d'Apple?
- 6. WPF ListView - comment ajouter des éléments par programme?
- 7. asp.net comment ajouter des éléments par programme à detailsview
- 8. Comment puis-je remplacer uniquement les éléments capturés d'une regex?
- 9. Comment ajouter des éléments à un menu par programme?
- 10. Comment remplacer la valeur d'attribut de * tous * les éléments correspondants par XQuery?
- 11. Remplacer la barre d'outils WinXP Tooltip par un autre programme
- 12. Comment masquer les fenêtres d'un programme externe par programme?
- 13. Comment obtenir les Etats-Unis par programme?
- 14. Comment supprimer par programme tous les éléments de la corbeille de deuxième niveau dans SharePoint 2007?
- 15. IIS7 Obtient les noeuds d'emplacement par programme
- 16. puis-je examiner par programme et modifier les gestionnaires d'événements Javascript sur les éléments html?
- 17. Comment contraignent paramètre types intégrés
- 18. Comment réordonner par programme les enfants d'une sous-classe ATFolder?
- 19. Remplacer SRC de tous les éléments IMG en utilisant Parser
- 20. Remplacer les couleurs par défaut de JComboBox
- 21. Comment est-ce que je peux remplacer (enrouler) des méthodes dans de nouvelles méthodes par programme?
- 22. UIToolbar et d'autres vues
- 23. UIToolbar plus et configurer les vues?
- 24. Ajouter des éléments à la liste par programme
- 25. Comment faire pour détecter par programme les fichiers supprimés?
- 26. remplacer l'image par css
- 27. Comment remplacer les associations de colonnes d'attributs par défaut d'enableecord?
- 28. Comment remplacer les occurrences de "-" par une chaîne vide?
- 29. Modifier les éléments de menu par programme depuis le plugin Eclipse
- 30. Connexion par programme au Sharepoint ULS
très utile, merci. Je vais essayer cela et vous laisser savoir comment ça se passe. – frankodwyer