iOS:如何在函数中刷新视图?

时间:2013-01-04 13:42:58

标签: ios

我对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。 缺什么?这似乎很明显。

2 个答案:

答案 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];
}