我发现有趣的事情..以下代码不显示@“一”,它显示@“两”后3秒延迟.. 我认为@“一”需要被显示,然后3秒延迟,然后@“两个”需要弹出.. 我错了吗?iOS标签文本改变与睡眠()
self.statusLabel.text = @"One";
sleep(3);
self.statusLabel.text = @"Two";
谢谢..
我发现有趣的事情..以下代码不显示@“一”,它显示@“两”后3秒延迟.. 我认为@“一”需要被显示,然后3秒延迟,然后@“两个”需要弹出.. 我错了吗?iOS标签文本改变与睡眠()
self.statusLabel.text = @"One";
sleep(3);
self.statusLabel.text = @"Two";
谢谢..
如果你在主线程中这样做,那么sleep(3)
会阻止它,冻结应用程序3秒钟。事件处理,包括重新绘制用户界面等事情不会发生,直到结束。
为了得到你期待什么,尝试这样的事情:
[self.statusLabel setText:@"One"];
[self.statusLabel performSelector:@selector(setText:)
withObject:@"Two"
afterDelay:3.0];
做的第一变化,然后排队等候进行第二次变化在未来发生的调用。然后将控制权返回给操作系统进行任何必要的重绘。
你的事情应该如何工作的观念是不正确。
self.statusLabel.text = @"One";
这将statusLabel字段的值设置为“One”。这不会立即画到屏幕上。相反,该标签将标记为需要显示。在当前运行循环结束时,将绘制标记为所需显示的所有视图,然后将其内容刷新到屏幕。
接下来你要做:
sleep(3);
self.statusLabel.text = @"Two";
此块3秒(不退还运行循环做上述工作),然后改变这标志着视图值“两个”主线程再次需要显示。
当它最终绘制并刷新到屏幕上时,当前值为“2”。
很难给出关于你应该做什么的更具体的建议,因为不清楚是否存在你正在尝试解决的实际问题,或者只是试验以便更多地了解框架。
但是你应该几乎从不使用睡眠,而且你肯定不应该在几秒钟内阻塞睡眠主线程。
谢谢清楚:)我正在考虑这与老派编程的方式..这意味着我可能需要做一个方法只改变标签文本,以实现我所需要做的.. – MomentH
你错了......
认为它是这样的:当你在一个块中执行代码你告诉你想要做什么的iOS。在您将控制权交还给操作系统后,实际上只有执行了。
你的代码阻塞了主线程(这是一个非常糟糕的事情)。
你需要做的是将标签设置为“One”,然后设置一个计时器,它将在三秒钟内启动。定时器中的代码将标签的文本设置为“两个”。
是的..现在我我正在理解它是如何工作的。谢谢:) – MomentH
我正在考虑另一种方法只改变标签文本,但这很容易..谢谢:) – MomentH
任何人可以告诉我如何根据值的数组更改标签文本。通过使用上述方法,我可以一个接一个地更改标签文本。但我希望通过使用循环或其他东西一个接一个地动态设置标签文本 – Raj
你想要一个NSTimer。 (performSelector:withObject:afterDelay:实际上是私人使用NSTimer。)编写一个方法,将标签的文本提升到下一个值;并设置一个定时器重复调用它。 – rgeorge