Une fois que mon utilisateur a cliqué sur un bouton, j'aimerais que ce bouton reste enfoncé pendant le temps que j'effectue une opération réseau. Une fois l'opération réseau terminée, je souhaite que le bouton revienne à son état par défaut.
J'ai essayé d'appeler - [UIButton setSelected:YES]
juste après avoir appuyé sur le bouton (avec un appel correspondant à - [UIButton setSelected:NO]
après la fin de mon opération réseau), mais cela ne semble rien faire. Même chose si j'appelle setHighlighted:
.
Je suppose que je pourrais essayer d'échanger l'image d'arrière-plan pour indiquer un état sélectionné pendant la durée de l'opération réseau, mais cela semble être un piratage. De meilleures suggestions?
Voici à quoi ressemble mon code:
- (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;
}
J'ai un moyen plus simple. Utilisez simplement "performSelector" avec un délai de 0 pour effectuer
[button setHighlighted:YES]
. Cela effectuera une re-surbrillance après la fin de la boucle d'exécution actuelle.la source
"Tout s'améliore lorsque vous allumez l'appareil"
fonctionne parfaitement ... après avoir connecté la prise au bouton dans l'Interface Builder.
Vous n'avez pas besoin de setBackgroundImage: forState :, le générateur vous permet de spécifier les images d'arrière-plan (redimensionnées si nécessaire) ou / et de premier plan (sans redimensionnement).
la source
Essayez d'utiliser NSOperationQueue pour y parvenir. Essayez le code comme suit:
J'espère que cela t'aides.
la source
Utilisez un bloc pour ne pas avoir à créer une méthode entièrement distincte:
Mettre à jour
Pour être clair, vous devez toujours définir l'arrière-plan (ou l'image normale) pour les états de combinaison ainsi que pour les états réguliers comme sbrocket dit dans la réponse acceptée. À un moment donné, votre bouton sera à la fois sélectionné et mis en surbrillance, et vous n'aurez pas d'image pour cela à moins que vous ne fassiez quelque chose comme ceci:
Sinon, votre bouton peut revenir à l'image UIControlStateNormal pour le bref état sélectionné + surligné et vous verrez un flash.
la source
dispatch_get_current_queue()
est déclaré comme étant "peu fiable".dispatch_after
par opposition àdispatch_async
?dispatch_async
est un meilleur choix.En rapidité, je le fais comme suit.
Je crée une sous-classe
UIButton
et implémente une propriété personnaliséestate
Fonctionne parfaitement pour moi.
la source
J'ai eu un problème similaire où je voulais qu'un bouton garde sa surbrillance après clic. Le problème est que si vous essayez d'utiliser à l'
setHighlighted:YES
intérieur de vous l'action de clic, elle sera réinitialisée juste après avoir cliqué sur action,- (IBAction)checkInButtonPushed
J'ai résolu cela en utilisant un NSTimer comme celui-ci
puis appelez
setHighlighted:YES
de maselectCurrentIndex
méthode. J'utilise desUIButtonTypeRoundedRect
boutons réguliers .la source
J'ai un autre moyen ... si vous ne voulez pas utiliser d'images et que vous voulez l'effet d'un bouton enfoncé, vous pouvez sous-classer le bouton et voici mon code:
dans le fichier .h:
Dans le fichier .m:
la source
Voici une implémentation C # / MonoTouch (Xamarin.iOS) à l'aide des approches présentées ci-dessus. Il suppose que vous avez déjà défini l'état de l'image en surbrillance et configure les états sélectionné et sélectionné | en surbrillance pour utiliser la même image.
la source