我试图每秒更改一个UIButton的UIImage,直到计数器达到0。我试过NSTimer,用Delay执行Selector,但我都无法让它们发挥作用,大量的谷歌搜索都给出了不同的选项,但指出了这样一个事实,即在for或while循环中,或者NSTimer正在运行时,我无法更新UI。
下面的代码让我接近尾声,日志显示执行暂停了一秒钟,imageName是正确的。。。。但是按钮图像没有改变。
非常感谢您的帮助。
- (void)setTimerCountdownImage {
NSString *imageWithTime = @"recordTimer";
UIImage *btnImage = [UIImage imageNamed:@"recordTimer.png"];
if (_timerDelay != 0) {
NSLog(@"Timer Delay is:%d", _timerDelay);
btnImage = [UIImage imageNamed:[[imageWithTime stringByAppendingString:[NSString stringWithFormat:@"%d", _timerDelay]] stringByAppendingString:@".png"]];
NSLog(@"TimerImage is: %@",[[imageWithTime stringByAppendingString:[NSString stringWithFormat:@"%d", _timerDelay]] stringByAppendingString:@".png"]);
[_toggleTimerBtn setImage:btnImage forState:UIControlStateNormal];
[self countDownTimer:_timerDelay];
}
else {
[_toggleTimerBtn setImage:btnImage forState:UIControlStateNormal];
}
}
-(void)countDownTimer:(int) currentDelay {
_timerDelay = _timerDelay -1;
NSLog(@"Time to sleep...");
[NSThread sleepForTimeInterval:1.0];
[self setTimerCountdownImage];
}
日志输出:
2015-02-17 01:42:22.357 SwingPlane〔299:16789〕定时器延迟为:5
2015-02-17 01:42:22.358 SwingPlane〔299:16789〕时间图片为:recordTimer5.png
2015-02-17 01:42:22.358摇摆飞机〔299:16789〕时间到睡眠
2015-02-17 01:42:23.360 SwingPlane〔299:16789〕定时器延迟是:4
2015-02-17 01:42:23.374摇摆飞机〔299:16789〕时间图片为:recordTimer4.png
2015-02-17 01:42:23.375摇摆飞机〔299:16789〕时间到睡眠
2015-02-17 01:42:24.377 SwingPlane〔299:16789〕定时器延迟是:3
2015-02-17 01:42:24.391摇摆飞机〔299:16789〕时间图片为:recordTimer3.png
2015-02-17 01:42:24.392摇摆飞机〔299:16789〕时间到睡眠
2015-02-17 01:42:25.394 SwingPlane〔299:16789〕定时器延迟是:2
2015-02-17 01:42:25.408摇摆飞机[299:16789]时间图片为:recordTimer2.png
2015-02-17 01:42:25.408摇摆飞机〔299:16789〕时间到睡眠
2015-02-17 01:42:26.411摇摆飞机〔299:16789〕定时器延迟是:1
2015-02-17 01:42:26.427 SwingPlane〔299:16789〕时间图片为:recordTimer1.png
2015-02-17 01:42:26.428摇摆飞机〔299:16789〕时间到睡觉
记住在主线程上进行所有UI更改。使用NSTimer!试试这个(我自己没有运行,如果不起作用,请告诉我):
- (void)startTimerWithDelay:(NSInteger)delay {
_timerDelay = delay;
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(setTimerCountdownImage) userInfo:nil repeats:YES];
}
- (void)setTimerCountdownImage {
NSString *imageWithTime = @"recordTimer";
UIImage *btnImage = [UIImage imageNamed:@"recordTimer.png"];
_timerDelay--;
if (_timerDelay != 0) {
btnImage = [UIImage imageNamed:[[imageWithTime stringByAppendingString:[NSString stringWithFormat:@"%d", _timerDelay]] stringByAppendingString:@".png"]];
} else {
[_timer invalidate];
}
dispatch_async(dispatch_get_main_queue(), ^{
[_toggleTimerBtn setImage:btnImage forState:UIControlStateNormal];
});
}
请记住将NSTimer *_timer
添加到类中,否则它将不起作用。