2011-08-28 41 views
4

我发现有趣的事情..以下代码不显示@“一”,它显示@“两”后3秒延迟.. 我认为@“一”需要被显示,然后3秒延迟,然后@“两个”需要弹出.. 我错了吗?iOS标签文本改变与睡眠()

self.statusLabel.text = @"One"; 
sleep(3); 
self.statusLabel.text = @"Two"; 

谢谢..

回答

7

如果你在主线程中这样做,那么sleep(3)会阻止它,冻结应用程序3秒钟。事件处理,包括重新绘制用户界面等事情不会发生,直到结束。

为了得到你期待什么,尝试这样的事情:

[self.statusLabel setText:@"One"]; 
[self.statusLabel performSelector:@selector(setText:) 
         withObject:@"Two" 
         afterDelay:3.0]; 

做的第一变化,然后排队等候进行第二次变化在未来发生的调用。然后将控制权返回给操作系统进行任何必要的重绘。

+0

我正在考虑另一种方法只改变标签文本,但这很容易..谢谢:) – MomentH

+0

任何人可以告诉我如何根据值的数组更改标签文本。通过使用上述方法,我可以一个接一个地更改标签文本。但我希望通过使用循环或其他东西一个接一个地动态设置标签文本 – Raj

+0

你想要一个NSTimer。 (performSelector:withObject:afterDelay:实际上是私人使用NSTimer。)编写一个方法,将标签的文本提升到下一个值;并设置一个定时器重复调用它。 – rgeorge

2

你的事情应该如何工作的观念是不正确。

self.statusLabel.text = @"One"; 

这将statusLabel字段的值设置为“One”。这不会立即画到屏幕上。相反,该标签将标记为需要显示。在当前运行循环结束时,将绘制标记为所需显示的所有视图,然后将其内容刷新到屏幕。

接下来你要做:

sleep(3); 
self.statusLabel.text = @"Two"; 

此块3秒(不退还运行循环做上述工作),然后改变这标志着视图值“两个”主线程再次需要显示。

当它最终绘制并刷新到屏幕上时,当前值为“2”。

很难给出关于你应该做什么的更具体的建议,因为不清楚是否存在你正在尝试解决的实际问题,或者只是试验以便更多地了解框架。

但是你应该几乎从不使用睡眠,而且你肯定不应该在几秒钟内阻塞睡眠主线程。

+0

谢谢清楚:)我正在考虑这与老派编程的方式..这意味着我可能需要做一个方法只改变标签文本,以实现我所需要做的.. – MomentH

1

你错了......

认为它是这样的:当你在一个块中执行代码你告诉你想要做什么的iOS。在您将控制权交还给操作系统后,实际上只有执行了

你的代码阻塞了主线程(这是一个非常糟糕的事情)。

你需要做的是将标签设置为“One”,然后设置一个计时器,它将在三秒钟内启动。定时器中的代码将标签的文本设置为“两个”。

+0

是的..现在我我正在理解它是如何工作的。谢谢:) – MomentH