我对iOS编程非常陌生,但我已经遇到了一个无法解决的大问题。这似乎很容易。
我有一个按钮,我点击它来更改名为message
以下是代码:
- (IBAction)react:(id)sender {
int hasard ;
hasard=3;
message.text=[NSString stringWithFormat:@"1 %d",hasard];
sleep (1);
message.text=[NSString stringWithFormat:@"2 %d",hasard];
}
效果很好,但我没有看到第一次message.text
更改。
当我点击按钮时,我必须等一秒钟,然后看到2 3
我以为我可以看到1 3
,等一下,然后看2 3
。
缺什么?这似乎很明显。
答案 0 :(得分:6)
sleep()
将暂停当前线程执行,这是主线程,因此您将阻止所有UI操作,直到方法完成。您需要安排第二个分配在指定时间后运行,而不会阻止当前运行循环。这可以通过GCD来实现。
- (IBAction)react:(id)sender {
int hasard ;
hasard=3;
message.text=[NSString stringWithFormat:@"1 %d",hasard];
int64_t delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
message.text=[NSString stringWithFormat:@"2 %d",hasard];
});
}
答案 1 :(得分:1)
您正在阻止主线程(好吧,而不是sleep()
阻止它)。如果这样做,则不会显示对UI的已提交更改 - 您只会看到最终结果。您必须做其他事情(顺便说一句,阻止UI在用户体验方面是一个非常糟糕的主意)。您可以尝试使用计时器,例如:
int hasard = 3;
- (void)react:(id)sender
{
message.text = [NSString stringWithFormat:@"1 %d", hasard];
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timer:) userInfo:nil repeats:NO];
}
- (void)timer:(NSTimer *)tmr
{
message.text = [NSString stringWithFormat:@"2 %d", hasard];
}