it-swarm.com.de

Xcode Objective-C | iOS: Verzögerungsfunktion/NSTimer-Hilfe?

Also entwickle ich meine erste iOS-Anwendung und brauche Hilfe.

Einfaches Programm für jetzt, ich habe ungefähr 9 Tasten und wenn ich die erste Taste oder eine beliebige Taste drücke, möchte ich nur, dass die erste Taste für 60 Millisekunden hervorgehoben wird, die Markierung für die zweite Taste hervorgehoben wird Der Rest der Tasten sieht aus wie eine bewegte LED.

Ich habe versucht, ausschlafen/schlafen zu lassen, aber sobald die Schlafdauer beendet ist, scheint es, als würde das Highlight/Unhighlight alle zusammen überspringen.

Zum Beispiel:

- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;

und so weiter für den Rest der Knöpfe. Es verzögert, aber es verzögert nicht "firstButton.enabled = NO;". Ich habe ein Bild für den "deaktivierten Status" jeder Schaltfläche und sehe es nie.

Jede Hilfe wird geschätzt! Ich habe mir NSTimer angeschaut, war mir aber nicht sicher, wie ich es implementieren soll.

Vielen Dank.

-Paul

33
Retro

sleep funktioniert nicht, da die Anzeige nur aktualisiert werden kann, nachdem der Haupt-Thread zum System zurückgekehrt ist. NSTimer ist der Weg zu gehen. Dazu müssen Sie Methoden implementieren, die vom Timer aufgerufen werden, um die Schaltflächen zu ändern. Ein Beispiel:

- (void)button_circleBusy:(id)sender {
    firstButton.enabled = NO;
    // 60 milliseconds is .06 seconds
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
}
- (void)goToSecondButton:(id)sender {
    firstButton.enabled = YES;
    secondButton.enabled = NO;
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO];
}
...
50
ughoavgfhw
int64_t delayInSeconds = 0.6;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     do something to the button(s)
});
47
Avner Barr

Weniger Code ist besserer Code.

[NSThread sleepForTimeInterval:0.06];

Swift:

Thread.sleep(forTimeInterval: 0.06)
29
Alex Haas

Etwas weniger wortreich ist die Verwendung von performSelector: withObject: afterDelay: Damit wird das NSTimer-Objekt für Sie eingerichtet und kann leicht abgebrochen werden

Weiter mit dem vorherigen Beispiel wäre dies also

[self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];

Weitere Infos im Dokument

25
ramirogm

Versuchen

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
16
Joe Völker

Ich möchte die Antwort von Avner Barr ein wenig hinzufügen. Bei der Verwendung von int64 scheint es, als würde die Funktion unterschiedlich verzögern, wenn wir den Wert 1,0 überschreiten. Ich denke, zu diesem Zeitpunkt sollten wir NSTimeInterval verwenden.

Der endgültige Code lautet also:

NSTimeInterval delayInSeconds = 0.05;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

//do your tasks here

});
3
John Bassos
[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];

Ist der beste zu verwenden. Unter Verwendung von Schlaf (15); führt dazu, dass der Benutzer keine anderen Aktionen ausführen kann. Mit der folgenden Funktion würden Sie goToSecondButton durch den entsprechenden Selektor oder Befehl ersetzen.

0
Hanson So