これを行う方法がわかりません。ボタンがあり、それをタップしたら5秒でプロセスを開始したいのですが、ユーザーが待っている間にカウントダウンを表示したい-5、4、3、2、1
これを機能させることができません。nstimerを使用してみましたが、機能しません。助言がありますか?ありがとう
これを行う方法がわかりません。ボタンがあり、それをタップしたら5秒でプロセスを開始したいのですが、ユーザーが待っている間にカウントダウンを表示したい-5、4、3、2、1
これを機能させることができません。nstimerを使用してみましたが、機能しません。助言がありますか?ありがとう
ブロックがスコープをキャプチャする方法を使用dispatch_after()
および利用して、残り秒数を追跡できます。
- (IBAction)buttonHandler:(UIButton *)sender
{
if (self.countingDown)
return;
[self startCountDown];
}
- (void)startCountDown
{
self.countingDown = YES;
self.button.enabled = NO;
int seconds = 5;
[self countDownFor:seconds];
}
- (void)countDownFor:(int)seconds
{
self.countDownLabel.text = [NSString stringWithFormat:@"%d",seconds];
if (seconds == 0) {
self.countingDown = NO;
self.button.enabled = YES;
return;
}
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self countDownFor:(seconds - 1)];
});
}
GCD とブロックを使用したエレガントなソリューション:
__block void (^runBlock)(int) = ^(int i) {
countdownLabel.text = [NSString stringWithFormat:@"%d", i];
if(i>0) {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1*NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
runBlock(i-1);
});
} else {
runBlock = nil; // Breaking retain cycle
// Time to start your great action!
// ...
}
};
runBlock(5);
次のようなものを試してください
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(methodNameUsedToupdateButtonText)
userInfo:nil
repeats:YES];
カウントダウンが0に達した場合(およびビューがアンロードされた場合)、タイマーを無効にします
NSTimerクラスリファレンスを確認してください