我有一个显示时间的标签;但是,时间不会更新。时间显示,但不计算在内。显示按下按钮的时间,该时间不会改变。这是我的代码
- (IBAction)startCamera:(id)sender
{
[self.videoCamera start];
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss"];
NSString *currentTime = [dateFormatter stringFromDate:today];
[dateFormatter setDateFormat:@"dd.MM.yyyy"];
NSString *currentDate = [dateFormatter stringFromDate:today];
for (int i = 1; i <= 10; i--) {
Label1.text = [NSString stringWithFormat:@"%@", currentTime];
Label2.text = [NSString stringWithFormat:@"%@", currentDate];
}
}
我尝试了for循环,但是没有更新时间。有什么建议吗?
答案 0 :(得分:2)
使用在主线程上运行的事件循环执行UI更新。你的for循环正在占用主线程,永远不会从你的启动函数返回。无论你在labelx.text中设置什么,都不会在屏幕上刷新,因为运行循环正在等待你的启动功能完成。
您应该阅读NSTimer以使用最佳做法实现此目的。
使用延迟调度还有一种方法可以做到这一点: (对不起,这是在Swift,我不知道Objective-C,但我相信你会得到这个想法)
// add this function and call it in your start function
func updateTime()
{
// update label1 and label2 here
// also add an exit condition to eventually stop
let waitTime = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC ) // one second wait duration
dispatch_after(waitTime, dispatch_get_main_queue(), {self.updateTime() }) // updateTime() calls itself every 1 second
}
答案 1 :(得分:0)
NSTimer有效,但不太准确。
当我需要准确的计时器时,我使用CADisplaylink,尤其是在处理动画时。这减少了视觉上的口吃。
使用显示器刷新准确可靠。但是,您不希望使用此方法进行繁重的计算。
- (void)startUpdateLoop {
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
displayLink.frameInterval = 60;
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)update {
// set you label text here.
}