如何立即更新UILabel?

3
我将尝试创建一个UILabel,以便在用户等待时通知他正在发生什么。然而,该UILabel总是延迟其文本更新,直到系统再次变得空闲。
流程如下:
[infoLine performSelectorOnMainThread:@selector(setText:) withObject:@"Calculating..." waitUntilDone:YES];
[distanceManager calc]; // Parses a XML and does some calculations
[infoLine performSelectorOnMainThread:@selector(setText:) withObject:@"Idle" waitUntilDone:YES];

等待完成不应该立即发生吗?


你尝试将 waitUntilDone 指定为 NO 吗? - vodkhang
您是在主UI线程上执行此操作,还是从其他线程上执行? - hotpaw2
4个回答

4
如果您正在主UI线程上执行此操作,请勿使用waitUntilDone。在完整视图上执行setText,setNeedsDisplay操作,设置一个NSTimer在1毫秒后启动下一步操作,然后从您的函数/方法返回。您可能需要将计算拆分为可以由计时器分别调用的块,可能是一个带有switch语句的状态机(选择块,执行块,增加块索引,退出),直到完成为止。UI会在计算块之间跳转并更新内容。因此,请确保您的块相当短(我使用15至200毫秒)。

请提供示例代码,演示如何“设置NSTimer在1毫秒后启动要执行的下一个操作”。谢谢!另外,我希望它在下一个运行循环中被触发。你怎么知道使用1毫秒的时间? - ma11hew28
一个小于16毫秒的非零值可能会在下一个运行循环或六个循环内触发。请参阅:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html - hotpaw2
太好了,谢谢!我已经解决了这个问题,并添加了在下一次运行循环中执行选择器的有用代码 - ma11hew28

0
使用 performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval) 方法:
self.infoLine.text = @"Calculating...";
[self performSelector:@selector(likeABoss) withObject:nil afterDelay:0.001];
//...
-(void) likeABoss {
    // hard work here
    self.infoLine.text = @"Idle";
}

0
这是我在UIViewController的子类中添加的一个有用的函数。它会在下一个运行循环中执行选择器。虽然它能正常工作,但你认为我应该将NSTimer *timer变成实例变量吗?因为很可能会多次调用此方法。
- (void)scheduleInNextRunloopSelector:(SEL)selector {
    NSDate *fireDate = [[NSDate alloc] initWithTimeIntervalSinceNow:0.001]; // 1 ms
    NSTimer *timer = [[NSTimer alloc]
                      initWithFireDate:fireDate interval:0.0 target:self
                      selector:selector userInfo:nil repeats:NO];
    [fireDate release];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [timer release];
}

0

是的,waitUntilDone 会立即执行 setText:,但设置标签的文本并不意味着屏幕会立即更新。

您可能需要 调用 -setNeedsDisplay,甚至让主运行循环滴答一次,才能更新屏幕。


我尝试使用[infoLine setNeedsDisplay];但是没有任何反应。在运行distanceManager之前,我该如何等待主循环先执行一次? - ciffa

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