12
votes

Comment remplacer par programme des éléments UIToolbar intégrés à IB

J'ai une barre d'outils avec divers boutons d'image, créé dans l'interface Builder.

J'aimerais pouvoir remplacer par programmation l'un des boutons avec un indicateur d'activité lorsque vous appuyez sur, puis reportez-vous au bouton d'origine, mais changez de couleur de blanc en jaune lorsque l'activité est terminée.

est-ce possible avec une barre d'outils construite IB ou dois-je envisager de construire toute la barre d'outils de la barre d'outils et des vues personnalisées?


0 commentaires

8 Réponses :


1
votes

Je pense que cela devrait être possible. Vous pouvez soit essayer de créer une iboutlet pour ce bouton spécifique de votre classe ViewController, puis connectez le bouton de IB à cette sortie ou vous pouvez utiliser la propriété Éléments de cette instance UIToolBar (vous avez une référence à cela, n'est-ce pas. ?) Et trouver l'élément approprié à cet endroit, créez un nouveau Nsarray avec des éléments modifiés et réglez-le sur cette propriété de la barre d'outils.Items.

htth


1 commentaires

Très utile, merci. Je vais essayer cela et vous faire savoir comment ça se passe.



2
votes

Voici l'approche que j'ai utilisée Il semblait être beaucoup plus simple de gérer la barre d'outils entièrement de manière programmée de manière à ....

dans votre contrôleur d'affichage Déclarez 1 ou plusieurs ensembles d'éléments UIBARBUTTNITEM en tant qu'éléments de propriété déclarent également la barre d'outils en tant que propriété UITOOLBAR. Déclarez également 1 ou plusieurs matrices pour contenir les éléments. P>

dans la mise en œuvre Dans la vue ViewDidLoad Alloc et définissez votre uibarbuttonitems par exemple P>

[toolbar setItems:<array name>];


0 commentaires

26
votes

Voici un exemple de ce que j'ai fait dans une situation similaire. Je voulais créer la barre d'outils à l'aide de Builder d'interface mais basculer l'un des barbouttonitems sur la base de la question de savoir s'il était ou non "vérifié". Dans cet exemple, il y a quelques éléments clés à noter. Les 2 variables de membre suivantes sont définies pour la classe dans le fichier d'en-tête: xxx pré>

Lorsque je veux mettre à jour l'état vérifié, j'appelle cette fonction ... Veuillez noter qu'il existe un sélecteur défini Appelé CheckuncheckClicked qui s'appelle lorsque le bouton particulier de l'UITOOLBAR est cliqué. Et l'uitoolbar est configuré comme une barre d'outils Iboutlet. Alternativement, vous pouvez connecter l'uibarbuttonitem comme une sortie elle-même et utilisez-la comme votre logique pour identifier l'index du bouton ou, à ce sujet, vous pouvez coder l'index du bouton si les choses ne changeront pas au fil du temps. Enfin, il y a un échec.png et non coché.png à alterner entre celui-ci est inclus dans le projet. P>

- (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;
    }
}


0 commentaires

0
votes

Une note à ce sujet - la barre d'outils dépendra de toutes les couleurs de vos icônes. Vous ne pourrez toujours pas le faire jaune. Vous devrez changer la forme de l'image pour indiquer "ON".

Vous devez également charger votre barbouttonitems avec UIButTons (utilisez l'initwithCustomView) et définissez l'image du bouton de manière appropriée.

htth


0 commentaires

0
votes

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 commentaires

Les nouveauxitems fuites lorsque vous faites une copie. Vous devriez le libérer après le "tb.items = newitems;" Appelez, car la barre d'outils le conservera seul.



2
votes

Swift

beaucoup a changé depuis que ces réponses ont été postées. Voici une solution Swift 2.0.

Il importe non comment l'original uibarbuttonitem que vous remplacez a été créé par programme. Tout ce dont vous avez besoin est la sortie uitoolbar . Pour remplacer, disons, le 2ème élément de la gauche, faites ceci: xxx


0 commentaires

2
votes

Swift a un moyen beaucoup plus facile. Dans mon cas, je chante le bouton de lecture avec le bouton de pause chaque touche.

@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
        }
    }
}


1 commentaires

Bonne solution! Bien que les self.toolbar.settems (Toolbaritems, animée: vraie) est manquante et sans cela, je crains que cela ne fonctionne pas.



0
votes

Pour l'ensemble de la barre d'outils que vous avez créée dans IB (c'est-à-dire à dire, pas les éléments de la barre d'outils individuels), créez une iboutlet:

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


1 commentaires

Merci pour le formatage @ Phiter-Fernandes. (J'espère que je l'ai fait correctement.)