2013-08-06 125 views
-1

我有一個UILabel,我想更新爲倒數計時器。目前我正在使用NSTimer在分配的非活動時間已過時執行方法。我找到了從this SO thread設置所需的NSTimer的代碼。我使用Chris Miles在應用程序的一個視圖控制器中發佈的示例代碼,當空閒時間達到kMaxIdleTimeSeconds時方法正常執行。根據NSTimer更新UILabel

但是我希望通過更新視圖控制器中的UILabel和剩餘的空閒時間,讓Chris Miles發佈代碼示例。我應該使用一個完全獨立的NSTimer來做到這一點,或者有什麼方法可以在註銷之前以當前NSTimer剩餘的空閒時間更新UILabel?

該應用程序的視圖控制器實現文件看起來像下面

#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 
+1

我只是回答了這個最近: http://stackoverflow.com/a/17414593/210171 – nielsbot

回答

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]; 
     } 
} 
+0

你願意在你的答案闡述了代碼示例? – Chris

+0

@Chris,我已經更新了一個代碼示例。 – rdelmar

+0

@rdelmar非常感謝你,代碼示例非常有幫助。 – Chris