Nachdem mein Benutzer auf eine Schaltfläche geklickt hat, möchte ich, dass diese Schaltfläche während der Ausführung eines Netzwerkvorgangs gedrückt bleibt. Wenn der Netzwerkvorgang abgeschlossen ist, soll die Schaltfläche in den Standardzustand zurückkehren.
Ich habe versucht [UIButton setSelected:YES]
anzurufen - direkt nach dem Drücken der Taste (mit einem entsprechenden Anruf an - [UIButton setSelected:NO]
nachdem mein Netzwerkbetrieb beendet ist), aber es scheint nichts zu tun. Das Gleiche, wenn ich anrufe setHighlighted:
.
Ich nehme an, ich könnte versuchen, das Hintergrundbild auszutauschen, um einen ausgewählten Status für die Dauer der Netzwerkoperation anzuzeigen, aber das scheint ein Hack zu sein. Irgendwelche besseren Vorschläge?
So sieht mein Code aus:
- (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;
}
Ich habe einen einfacheren Weg. Verwenden Sie einfach "performSelector" mit 0 Verzögerung, um durchzuführen
[button setHighlighted:YES]
. Dadurch wird nach dem Ende des aktuellen Runloops eine erneute Hervorhebung durchgeführt.quelle
"Alles wird besser, wenn Sie das Gerät einschalten"
funktioniert einwandfrei ... nachdem ich die Steckdose mit der Schaltfläche im Interface Builder verbunden habe.
Sie müssen SetBackgroundImage: forState: nicht festlegen. Mit dem Builder können Sie den Hintergrund (bei Bedarf wird die Größe geändert) oder / und den Vordergrund (ohne Größenänderung) angeben.
quelle
Versuchen Sie dies mit NSOperationQueue. Probieren Sie den Code wie folgt aus:
Hoffe das hilft.
quelle
Verwenden Sie einen Block, damit Sie keine separate Methode erstellen müssen:
Aktualisieren
Um klar zu sein, müssen Sie immer noch den Hintergrund (oder das normale Bild) für die Kombinationszustände sowie die regulären festlegen, wie sbrocket in der akzeptierten Antwort sagt. Irgendwann wird Ihre Schaltfläche sowohl ausgewählt als auch hervorgehoben, und Sie haben kein Bild dafür, es sei denn, Sie tun Folgendes:
Andernfalls kann Ihre Schaltfläche für den kurzen ausgewählten + hervorgehobenen Status auf das UIControlStateNormal-Bild zurückgreifen, und Sie sehen einen Blitz.
quelle
dispatch_get_current_queue()
wird als "unzuverlässig" eingestuft.dispatch_after
Gegensatz zudispatch_async
?dispatch_async
ist eine bessere Wahl.In Kürze mache ich es wie folgt.
Ich erstelle eine Unterklasse von
UIButton
und implementiere eine benutzerdefinierte Eigenschaftstate
Funktioniert perfekt für mich.
quelle
Ich hatte ein ähnliches Problem, bei dem ich wollte, dass eine Schaltfläche nach dem Klicken die Hervorhebung beibehält. Das Problem ist, wenn Sie versuchen,
setHighlighted:YES
innerhalb Ihrer Klickaktion zu verwenden, wird es direkt nach dem Klicken auf Aktion zurückgesetzt.- (IBAction)checkInButtonPushed
Ich habe dies mit einem solchen NSTimer gelöst
und dann
setHighlighted:YES
von meinerselectCurrentIndex
Methode aufrufen . Ich benutze normaleUIButtonTypeRoundedRect
Knöpfe.quelle
Ich habe einen anderen Weg ... Wenn Sie keine Bilder verwenden möchten und den Effekt eines gedrückten Knopfes wünschen, können Sie den Knopf unterordnen und hier ist mein Code:
in der .h-Datei:
In der .m-Datei:
quelle
Hier ist eine C # / MonoTouch-Implementierung (Xamarin.iOS) unter Verwendung der oben dargestellten Ansätze. Es wird davon ausgegangen, dass Sie den Status des hervorgehobenen Bilds bereits festgelegt haben, und der ausgewählte und der ausgewählte | hervorgehobene Status werden so konfiguriert, dass dasselbe Bild verwendet wird.
quelle