-1

カウントダウン タイマーとして更新したい UILabel があります。現在、割り当てられた非アクティブ時間が経過したときにメソッドを実行するために NSTimer を使用しています。この SO スレッドから目的の NSTimer を設定するためのコードを見つけました。アプリケーションのビュー コントローラーの 1 つで Chris Miles によって投稿されたサンプル コードを使用しています。アイドル時間がkMaxIdleTimeSeconds.

ただし、Chris Miles によって投稿されたコード例をさらに一歩進めて、ビュー コントローラーの UILabel を残りのアイドル時間で更新したいと考えていました。これを行うには完全に別の NSTimer を使用する必要がありますか、またはログアウトする前に現在の NSTimer でアイドル時間を残して UILabel を更新する方法はありますか?

アプリケーションのView Controller実装ファイルは次のようになります。

#import "ViewControllerCreate.h"
#import "math.h"

@interface ViewControllerHome ()

#define kMaxIdleTimeSeconds 20.0

@implementation ViewControllerHome

@end

- (void)viewDidLoad
{

// 5AUG13 - idle time logout
    [self resetIdleTimer];

    int idleTimerTime_int;

    idleTimerTime_int = (int)roundf(kMaxIdleTimeSeconds);

    _idleTimerTime.text = [NSString stringWithFormat:@"%d secs til",idleTimerTime_int];

}

- (void)viewDidUnload
{
[self setIdleTimerTime:nil];
    // set the idleTimer to nil so the idleTimer doesn't tick away on the welcome screen.
    idleTimer = nil;
    [super viewDidUnload];
}

#pragma mark -
#pragma mark Handling idle timeout

- (void)resetIdleTimer {
    if (!idleTimer ) {
        idleTimer = [NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds
                                                      target:self
                                                    selector:@selector(idleTimerExceeded)
                                                    userInfo:nil
                                                    repeats:YES];
    }
    else {
        if(fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0) {
            [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]];
        }
    }
}

- (void)idleTimerExceeded {
    NSLog(@"lets see what happens");
    [idleTimer invalidate];
    [self logout:nil];
    [self resetIdleTimer];
}

// method is fired when user touches screen.
- (UIResponder *)nextResponder {
    [self resetIdleTimer];
    return [super nextResponder];
}

@end
4

1 に答える 1

1

あなたが投稿したコードはまったく使用しません。最大アイドル時間でラベルを開始し、タイマーのアクション メソッドを 1 秒ごとに呼び出して、ラベルのテキストの intValue から 1 を減算してみませんか。ラベルの値が 0 になったら、必要なことを行い、タイマーを無効にします。

このようなもの:

- (void)viewDidLoad {
      [super viewDidLoad];
      self.label.text = @"1000";
      [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countDown:) userInfo:nil repeats:YES];
}

-(void)countDown:(NSTimer *) aTimer {
      self.label.text = [NSString stringWithFormat:@"%d",[self.label.text  intValue] - 1];
      if ([self.label.text isEqualToString:@"0"]) {
           //do whatever
           [aTimer invalidate];
      }
}
于 2013-08-06T19:10:57.857 に答える