UILabel文本未更新

时间:2011-07-26 19:33:26

标签: ios uilabel asihttprequest

我无法更改UILabel文字。 viewDidLoad中UILabel的代码是:

startLabel=[[UILabel alloc] initWithFrame:CGRectMake(75, 395, 200, 30)];
startLabel.text=@"Recording Sound ...";
startLabel.backgroundColor=[UIColor clearColor];
startLabel.textColor=[UIColor whiteColor];
startLabel.font=[UIFont boldSystemFontOfSize:17];

[self.view addSubview:startLabel];

稍后,如果我想使用以下代码更改文本标签,则不会更改应用程序:

startLabel.text=@"Searching Database ...";

[startLabel setText:@"Searching Database ..."];

UILabel不是空的,我在调试期间将其打印出来并显示:

(gdb) po startLabel
<UILabel: 0x2c1a30; frame = (75 395; 200 30); text = 'Searching Database ...'; 
clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>

因此,标签文本在UILabel内部发生变化,但屏幕上没有更新。

任何人都可以让我知道 我在这儿不见了?感谢。

编辑1:我试过performSelectorOnMainThread: - 对我没用。 编辑2:我正在使用AVFoundationASIHTTP类来录制声音并在此处上传录制的文件。没有其他的。没有使用任何线程。

4 个答案:

答案 0 :(得分:49)

在我的情况下,正在更新的函数是从一个线程上的触摸识别器调用的,但是函数中我正在改变标签的text属性值的位置我把它放回到主线程上:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.someLabel setText:someString];
});

答案 1 :(得分:47)

您可能会遇到上述评论中提到的线程问题。如果您有一个在主线程上运行并执行某些活动的方法(例如搜索数据库),则在运行循环获得控制权之前,不会提交您对UI所做的更新。因此,如果您在主线程上执行了一项耗时且耗时的任务,请在设置标签文本后运行此代码:

- (void)doSomethingTimeConsuming
    ... consume some time ...
    ... set text of label ...
    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    ... continue long operation ...
}

这应该清除您所做的任何UI更改。虽然这可能是一个明智和功能性的黑客,但它并没有超越替代方案。我强烈建议您在后台线程上执行应用程序的耗时任务,并使用performSelectorOnMainThread:withObject:waitUntilDone:通过主线程更新UI。请参阅iOS Thread Management上的Apple页面。

答案 2 :(得分:3)

我的意外有点意外,虽然合理 - 但不是任何人都认为太难的事情。

当我收到UILabel时,我应该更新NSNotification我在其他地方解雇了。但是,通知是从后台线程触发的,因此即使是更新标签文本的侦听器方法也会在后台触发。

如果您依靠NSNotification更新标签或任何视图,请从主UI线程中触发NSNotification

答案 3 :(得分:2)

我有一个UILabel显示的级别号不会更新到UIViewController上的新级别号。我能找到的唯一可行解决方案是在拥有UILabel的视图控制器的主线程上调用setNeedsDisplay

-(void)changeLevelLabel:(int)theLevel {
dispatch_async(dispatch_get_main_queue(), ^{
    self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel];
    [self.levelLabel setNeedsDisplay];
});

}

有关更详细的说明,请参阅http://iosdevelopmentjournal.com/blog/2013/01/16/forcing-things-to-run-on-the-main-thread/

相关问题