0

これを行う方法がわかりません。ボタンがあり、それをタップしたら5秒でプロセスを開始したいのですが、ユーザーが待っている間にカウントダウンを表示したい-5、4、3、2、1

これを機能させることができません。nstimerを使用してみましたが、機能しません。助言がありますか?ありがとう

4

3 に答える 3

2

ブロックがスコープをキャプチャする方法を使用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)];
    });
}
于 2013-02-06T20:25:21.167 に答える
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);
于 2013-02-06T20:45:33.520 に答える
0

次のようなものを試してください

[NSTimer scheduledTimerWithTimeInterval:1 
                                       target:self
                                     selector:@selector(methodNameUsedToupdateButtonText)
                                     userInfo:nil
                                      repeats:YES];

カウントダウンが0に達した場合(およびビューがアンロードされた場合)、タイマーを無効にします

NSTimerクラスリファレンスを確認してください

于 2013-02-06T20:16:41.033 に答える