倒计时定时器 iOS 教程?

27

我正在制作一款与考试有关的应用程序,因此当考试开始时,时间应该随之开始。例如30分钟,并且它应该以29:59的方式递减。

我该如何实现这个功能?

请问有人可以给我一个示例或易于跟随的逐步教程吗?

1个回答

67

这段代码用于创建一个倒计时计时器。

.h文件的代码。

@interface UIMyContoller : UIViewController {

NSTimer *timer;
    IBOutlet UILabel *myCounterLabel;
}

@property (nonatomic, retain) UILabel *myCounterLabel;

-(void)updateCounter:(NSTimer *)theTimer;
-(void)countdownTimer;

@end

.m文件的代码。

@implementation UIMyController
@synthesize myCounterLabel;

int hours, minutes, seconds;
int secondsLeft;

- (void)viewDidLoad {
    [super viewDidLoad];

    secondsLeft = 16925;
    [self countdownTimer];
}

- (void)updateCounter:(NSTimer *)theTimer {
    if(secondsLeft > 0 ) {
        secondsLeft -- ;
        hours = secondsLeft / 3600;
        minutes = (secondsLeft % 3600) / 60;
        seconds = (secondsLeft %3600) % 60;
        myCounterLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
    } else {
        secondsLeft = 16925;
    }
}

-(void)countdownTimer {

    secondsLeft = hours = minutes = seconds = 0;
    if([timer isValid]) {
        [timer release];
    }
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];
    [pool release];
}

希望这能对你有所帮助。


我认为如果你设置了一个30分钟的计时器,你的屏幕将会关闭,同时你的应用程序也会停止工作。所以,如果你回到应用程序时打开屏幕,你将无法倒计时过去的时间。 - Camilo Aguilar
1
问题在于:如果您使用导航控制器,返回到上一个视图并重新加载此视图,则秒数将减少两个而不是一个。 - Kiddo
所以我在返回按钮上添加了[timer invalidate]。 - Kiddo
1
这对我帮助很大,谢谢!对于未来看到这篇文章的人:我能够削减很多内容。在最后一个方法中,实际上我只需要 timer = ...; 这一行 - 在 -(void)countdownTimer 中的其他所有内容都可以安全省略。 - temporary_user_name
看到Kiddo和Aerovistae说的,你可能想在if([timer isValid])里面添加[timer invalidate]。这样可以解决问题,同时保持ARC兼容性。 - Uzaak
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接