我有一个UILabel,我想作为倒数计时器更新。目前,我正在使用NSTimer在分配的非活动时间过后执行方法。我找到了从this SO thread设置所需NSTimer的代码。我正在使用Chris Miles在应用程序的一个视图控制器中发布的示例代码,并且当空闲时间到达kMaxIdleTimeSeconds
时,该方法正在正确执行。
然而,我希望通过使用剩余空闲时间更新视图控制器中的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
答案 0 :(得分: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];
}
}