Ios 未更新UILabel文本

Ios 未更新UILabel文本,ios,uilabel,asihttprequest,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]; star

我无法更改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 ...";

UILabel不是空的,我在调试时打印出来,它显示:

(gdb) po startLabel
<UILabel: 0x2c1a30; frame = (75 395; 200 30); text = 'Searching Database ...'; 
clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x2ae8f0>>
(gdb)订单标签
因此,标签的文本在UILabel中更改,但在屏幕上不会更新

有人能告诉我什么吗 我在这里失踪了?谢谢

编辑1:我尝试了执行选择线程:-对我无效。
编辑2:我正在使用
AVFoundation
ASIHTTP
类来录制声音并将录制的文件上传到这里。没有别的了。没有使用任何线程。

您可能面临上述评论中提到的线程问题。如果有一个方法在主线程上运行并执行某些活动(例如搜索数据库),则在运行循环得到控制之前,不会提交对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。请参见上的Apple页面。

在我的例子中,正在更新的函数是从线程上的触摸识别器调用的,但在函数中更改标签文本属性值的位置,我将其放回主线程:

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

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

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


请参阅以获得更详细的解释

我的解释有点出乎意料,虽然合理——只是没有人想得太多

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


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

您在哪里更新文本(什么方法)?它需要在同一个线程上(请参阅:)@Ben:monotouch不是这样吗?另外,我在同一个线程中,只是另一个函数!我完全没有注意到这是一个单点触摸的问题,但我在一个使用performSelectorOnMainThread()的Mac论坛中发现了一个类似的问题,关于需要在同一个线程上,所以我只是想知道你是从哪里调用它的。@Ben:nope..不工作..:(…还有其他建议吗?谢谢你的建议。以下是我在应用程序/视图中所做的。我正在使用AVFoundation录制一些声音,并使用ASIHTTP类上载录制的声音。没有什么特别的…在上载文件的函数中(自定义函数),我最初编写的代码是为了更改标签。没有任何效果。我甚至尝试了performSelectorOnMainThread…没有效果。您认为录制/上载可以作为一个单独的线程吗?请建议我可以做什么。谢谢。[[nsrunlop main runloop]…成功了…另一个备用线程没有…非常感谢:)谢谢,我也遇到了类似的问题,但是
performselectornmainthread:withObject:waitUntilDone:
解决方案对我来说非常有效。将问题追溯到触发UI更新(但未显示)的事实来自设置为在异步URL请求完成后运行的代码块。我甚至可能建议在您的答案中更突出地显示该解决方案,以便人们不会错过它,因为它是当前公认的答案?甚至
[[nsrunlop main runloop]runUntilDate:[NSDate datewithtimeintervalencenow:0];
对我来说都很有用(使用0时间间隔)简单易用。谢谢!我正在尝试从通知中心内调用的方法刷新文本,这解决了问题,谢谢!
-(void)changeLevelLabel:(int)theLevel {
dispatch_async(dispatch_get_main_queue(), ^{
    self.levelLabel.text = [NSString stringWithFormat:@"%d",theLevel];
    [self.levelLabel setNeedsDisplay];
});