90 votes

Garder un UIButton sélectionné après une touche

Après mon utilisateur clique sur un bouton, je voudrais que le bouton de rester enfoncée pendant le temps que j'ai effectuer une opération réseau. Lorsque le réseau est terminée, je veux que le bouton pour revenir à son état par défaut.

J'ai essayé de les appeler, -[UIButton setSelected:YES] juste après le bouton-poussoir (avec un appel correspondant à -[UIButton setSelected:NO] après mon réseau op finitions) mais il ne semble pas faire quoi que ce soit. Même chose si je l'appelle, setHighlighted:.

Je suppose que je pourrais essayer de changer l'image d'arrière-plan pour désigner un état sélectionné pour la durée du réseau de l'op, mais c'est un hack. Toutes les meilleures suggestions?

Voici ce que mon code ressemble à ceci:

- (IBAction)checkInButtonPushed
{
    self.checkInButton.enabled = NO;
    self.checkInButton.selected = YES;
    self.checkInButton.highlighted = YES;
    [self.checkInActivityIndicatorView startAnimating];
    [CheckInOperation startWithPlace:self.place delegate:self];
}

- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
    [self.checkInActivityIndicatorView stopAnimating];
    self.checkInButton.enabled = YES;
    self.checkInButton.selected = NO;
    self.checkInButton.highlighted = NO;
}

74voto

Sbrocket Points 5267

Comment vous mettez-vous les images pour les différents UIControlStates sur le bouton? Vous le mettre une image de fond pour UIControlStateHighlighted ainsi que UIControlStateSelected?

UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"];
[button setBackgroundImage:someImage forState:UIControlStateHighlighted];
[button setBackgroundImage:someImage forState:UIControlStateSelected];

Si vous êtes le réglage de l'état sélectionné sur le bouton tactile en bas de l'événement plutôt que de toucher à l'intérieur, votre bouton sera effectivement en surbrillance+état sélectionné, de sorte que vous aurez envie de jeu de trop.

[button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected];

Edit:

Pour résumer mes remarques dans les commentaires et à l'adresse le code que vous avez posté...vous devez définir vos images d'arrière-plan pour le plein UIControl de l'état que vous êtes dans. En fonction de votre extrait de code, ce contrôle de l'état serait désactivé+sélectionné+mis en évidence pour la durée de l'exploitation du réseau. Cela signifie que vous auriez besoin de faire cela:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected];

Si vous supprimez l' highlighted = YES, vous auriez besoin de ceci:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected];

Obtenez l'image?

30voto

Hlung Points 2286

J’ai un moyen plus facile. Il suffit d’utiliser « performSelector » avec un retard de 0 pour exécuter `` . Cela se produira re-mise en évidence après la fin de l’actuelle runloop.

28voto

« Tout s’améliore lorsque vous allumez l’alimentation »

fonctionne parfaitement... après j’ai branché la prise au bouton dans l’Interface Builder.

Vous n’avez pas besoin de setBackgroundImage:forState :, le constructeur permet de spécifier l’arrière-plan (obtient redimensionnée si nécessaire) ou / et des images de premier plan (ne pas le redimensionnement).

27voto

roberto.buratti Points 1058

Essayez d’utiliser NSOperationQueue pour atteindre cet objectif. Essayez le code comme suit :

J’espère que cela aide.

8voto

Bob Spryn Points 6886

Utiliser un bloc de sorte que vous n'avez pas à construire un ensemble de méthode distincte:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
    theButton.highlighted = YES;
});

Mise à jour

Pour être clair, vous devez encore définir l'arrière-plan (ou une image normale) pour la combinaison états ainsi que de l'ordinaire, comme sbrocket dit dans la accepté de répondre. À un certain point, votre bouton sera à la fois sélectionné, et vous n'aurez pas une image pour que, sauf si vous faites quelque chose comme cela:

[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];

Sinon, votre bouton peuvent revenir à la UIControlStateNormal image pour la brève sélectionné+surbrillance et vous verrez un flash.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X