Xcode Objective-C | iOS: функция задержки/помощь NSTimer?
Итак, я разрабатываю свое первое приложение для iOS, и мне нужна помощь.
Простая программа на данный момент, у меня около 9 кнопок, и когда я нажимаю первую кнопку или любую кнопку, я просто хочу, чтобы первая кнопка выделялась в течение 60 миллисекунд, подсвечивание, подсветка второй кнопки, подождать 60 миллисекунд, для остальных кнопок, чтобы он выглядел как движущийся светодиод.
Я смотрел проверенный спящий/спящий режим, но как только эта продолжительность сна завершена, кажется, что он пропускает выделение /unhighlight все вместе.
Например:
- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;
и т.д. для остальных кнопок. Он задерживается, но он не задерживает "firstButton.enabled = NO;". У меня есть изображение для каждой кнопки "отключенное состояние", и я никогда не вижу его.
Любая помощь ценится! Я просмотрел NSTimer, но я не знал, как его реализовать.
Спасибо.
-Поль
Ответы
Ответ 1
sleep
не работает, потому что отображение может быть обновлено только после того, как ваш основной поток вернется в систему. NSTimer - это путь. Для этого вам необходимо реализовать методы, которые будут вызываться таймером для изменения кнопок. Пример:
- (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];
}
...
Ответ 2
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)
});
Ответ 3
Меньше кода - лучший код.
[NSThread sleepForTimeInterval:0.06];
Swift:
Thread.sleep(forTimeInterval: 0.06)
Ответ 4
Несколько менее подробный способ - использовать performSelector: withObject: afterDelay:
который устанавливает для вас объект NSTimer и может быть легко отменен.
Итак, продолжая предыдущий пример, это будет
[self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];
Подробнее информация в документе
Ответ 5
Try
NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
Ответ 6
Я хотел бы добавить немного ответа Авнера Барра. При использовании int64, кажется, что, когда мы превосходим значение 1.0, функция, похоже, задерживается по-разному. Поэтому я думаю, что в этот момент мы должны использовать NSTimeInterval.
Итак, окончательный код:
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
});
Ответ 7
[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
Лучше всего использовать. Использование сна (15); приведет к тому, что пользователь не сможет выполнять какие-либо другие действия. С помощью следующей функции вы замените goToSecondButton соответствующим селектором или командой, которая также может быть из фреймворков.