如何经常更新UILabel?

时间:2010-08-11 13:39:55

标签: iphone uilabel nsthread

我目前正在开发一个项目,我在控制器中请求和解析多个html网站。为了向用户提供一些反馈,我创建了第二个视图,该视图在处理数据期间显示。它显示状态标签和进度条。在我的控制器中,我有几个点可以更新标签文本。不幸的是,这有时只会起作我猜那是因为标签只是偶尔会重新绘制一次,我尝试这样做的次数可能超过一次。

使用[label setNeedsDisplay]强制重绘是不行的;

我还创建了一个线程,它使用全局变量的文本更新标签文本,并且每秒都在标签上调用setNeedsDisplay。但结果却一样。我只看到某些变化,但不是全部。

一切都设置正确,标签永远不会是零。当我记录我的updateMethod时,一切似乎都很好。它只是没有显示!

干杯

这是我的线程的代码

- (void)startUpdateStatusThread{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
[self performSelectorOnMainThread:@selector(updateFrequently) withObject:nil waitUntilDone:NO];
[pool release];
}



- (void)updateFrequently{
NSLog(@"updateFrequently: %@", currentStatus);
test++;
[self.statusLabel setText:[NSString stringWithFormat:@"%@ - %i", currentStatus, test]];
[self.statusLabel setNeedsDisplay];
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self   selector:@selector(updateFrequently) userInfo:nil repeats:NO];
}

3 个答案:

答案 0 :(得分:3)

如果我假设您在解析网站的“线程”中调用标签的文本属性以及setNeedsDisplay,我是对的吗?

请注意:必须在主线程上对UIViews(或UIView的子类,如标签)进行更改。

我建议你做的是编写一个帮助方法来更新你的标签并调用setNeedDisplay,来自你的Parser-Thread调用中的

[mainViewController performSelectorOnMainThread:@selector(yourUpdateLabelHelper:) withObject:nil waitUntilDone:NO];

应该完成你的工作。

答案 1 :(得分:2)

你提到线程。请注意,UIKit控件(例如UILabel)只能从主线程更新。确保您只是尝试从主线程设置标签的文本,然后验证您是否仍有问题。

由于问题编辑而编辑:

首先,-setNeedsDisplay只告诉下次刷新屏幕时需要重新显示的视图,它不会强制显示当时的显示。

其次,iPhone屏幕吸收约60赫兹。这意味着每隔0.016666秒就会有一次更新。您尝试更新的速度要快得多,因此实际上只会显示大约每160个更新一次。

第三,也许最重要的是,你似乎没有创建任何线程,除非你从后台线程调用-startUpdateStatusThread。无论哪种方式,一旦你点击--updateFrequently一切都回到主线程。根据您正在安排该计时器的频率,您可能会使CPU过载并使其进行,以便系统没有时间绘制标签。因此,即使您正在设置新文本,也不会给它渲染的机会。你需要降低那个计时器的频率,你可能需要重新思考你想要做的事情。

答案 2 :(得分:1)

我认为计时器的创建应该是单独的功能: 允许重复并将计时器存储在可以在dealloc上关闭的成员变量中。 [NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(updateFrequently)userInfo:nil repeats:YES]; }

更新功能应作为回调函数运行。

此致 Assayag