2010-08-11 73 views
2

我目前正在一个项目中,我要求和解析控制器中的多个html网站。为了向用户提供一些反馈,我创建了第二个视图,在处理数据期间显示该视图。它显示一个状态标签和一个进度条。在我的控制器中,我有几点要更新标签文本。不幸的是,这只有时有效。我想那是因为标签只会在一段时间内重新绘制一次,而我试图这样做的次数可能比每秒一次更多。如何频繁更新UILabel?

用[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]; 
} 
+1

请进入您的个人资料http://stackoverflow.com/users/345144/jagse并接受先前问题的答案。这给予信贷的地方,信用是为了帮助你的人。 – iwasrobbed 2010-08-11 13:45:01

+0

你知道你装载手机的cpu有多沉重吗?如果你想把它搞清楚,它可能永远没有时间重绘。另外,您可能需要记住这一点:http://blogs.msdn.com/b/oldnewthing/archive/2010/05/25/10014185.aspx#10014738 – Douglas 2010-08-11 14:34:04

回答

2

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

EDIT由于问题编辑:

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

其次,iPhone屏幕在约60赫兹。这意味着每0.016666秒有一次更新。你正在尝试更新更快,因此实际上只显示大约每160次更新。

第三,也许最重要的是,除非您从后台线程调用-startUpdateStatusThread,否则您似乎没有制作任何线程。无论哪种方式,一旦你点击 - 更新,经常回到主线程。由于您正在调度该计时器的频率,因此您可能会使CPU超负荷,并使系统无法抽出标签。所以即使你设置了新的文字,你也没有给它一个渲染的机会。您需要减少该计时器的频率,并且您可能需要重新考虑您正在尝试执行的任何操作。

+0

请参阅上面问题中的编辑 – jagse 2010-08-11 14:34:37

3

我是否正确?如果我假设您在解析您的网站的“线索”中调用您的标签的文本属性以及setNeedsDisplay

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

我建议你做的是写更新您的标签,并呼吁setNeedDisplay,一个辅助方法从解析器线程调用

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

,应该让你的工作完成之内。

+0

请参阅编辑在上面的问题 – jagse 2010-08-11 14:33:56

1

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

更新函数应该作为回调函数来操作。

问候 Assayag