我有一个带for()循环的方法。在该循环中,mylabel.text会多次更新。但是,在方法完成之前,实际标签不会在屏幕上更新,使用for()循环中创建的最后一个值进行更新。
使用NSLog,它在for()循环的中间进行更新,我看到标签的值确实多次改变。
iOS中的一般做法是不在for()循环中更新标签吗?我想有办法做到这一点。
答案 0 :(得分:14)
您可以通过告诉运行循环如下运行来进行UI更新:
for (NSInteger i = 0; i < 10; i++) {
[label setText:...];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}
答案 1 :(得分:8)
从我之前的评论:
请注意,此(
runMode:beforeDate:
)可能会产生各种奇怪的副作用。当你调用runMode:beforeDate:时,你的循环中间可能会发生各种各样的事情。定时器可以开火; WebKit可以做各种疯狂;延迟选择器可以发射。这是一个非常危险的伎俩。有时是有用的,偶尔也是必要的(特别是在Mac上),但不是通用工具。
更好的解决方案是在主调度队列上安排更新:
for (NSInteger i = 0; i < 10; i++) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, i * NSEC_PER_SEC),
dispatch_get_main_queue(), ^{
[self.label setText:[NSString stringWithFormat:@"%d", i]];
});
}
这会安排10次更新1秒。它可以适应各种其他要求,而无需在主运行循环上创建阻塞方法。
答案 2 :(得分:-2)
试
[yourLabel setNeedsDisplay];