2013-03-20 68 views
0

我正在调用json/rest服务并将返回的数据传递给屏幕上的UILabel。我的屏幕由静态分组表组成,其中包含许多具有标题和细节的单元格。用返回的内容设置uilabel.text后,屏幕不显示该值,但如果我点击UILabel,则会显示该值。看来我错过了一个刷新屏幕的命令。下面的代码在从回调块中的json/rest服务接收到数据后,从viewDiDLoad方法中调用。未更新UILabel内容

[MEUser retrieveLoggedUserDetails:^(MEUser *meUser, NSError *error) { 
     if (meUser) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       self.email.text = meUser.email; 
       self.firstName.text = meUser.firstName; 
       self.lastName.text = meUser.lastName; 
       self.phone.text = meUser.phone; 


      }); 
     } 
    }]; 

任何帮助将不胜感激。

非常感谢, 马科斯

+1

你必须从主线程**中调用UIKit。**你没有做到这一点,因此你的程序调用未定义的行为。 – 2013-03-20 17:51:33

+0

dispatch_get_main_queue()说我从主线程调用,不是? – vilelam 2013-03-20 17:59:53

+0

您是否检查self.firstname是否为零? – 2013-03-20 18:05:35

回答

0

答案在于你的代码本身。当您dispatch_async时,{}内的代码不会很快执行。相反,你的viewDidLoad会立即返回。有时之后,下面的行会打:

self.firstname.text = meUser.firstname; 

从你的描述,这是我猜可能发生的:当你点击(TAP)的标签,你正迫使主队列清理其待决任务,其中一个可能在代码上面。所以它把价值标签,并显示给你。

您需要决定您何时想要标签刷新,然后只希望它保存更新的文本。

+0

我没有得到你最后的想法“你需要决定什么时候你想要标签刷新,然后只期望它保存更新的文本。”“ – vilelam 2013-03-21 00:01:30

+0

我的意思是代码负责查看更新值([ self.firstname setNeedsDisplay])应该在更新值后立即调用 – 2013-03-21 05:29:22

+0

更新了值后我试过setNeedsDisplay命令,但它不起作用 – vilelam 2013-03-21 13:50:21

1

设置文本后尝试此操作。

[self.firstname setNeedsDisplay]; 
+0

这就是抛出一个异常,你的意思是'[self.firstname setNeedsDisplay] ;' – 2013-03-20 18:04:16

+0

@HermannKlecker任何它会导致异常的原因?我只是好奇,块内的代码在主队列本身上执行,虽然是异步执行的,异常的原因是什么? – 2013-03-21 05:32:08

+0

我只是假设自己是一个视图控制器,firstname是UILabel,text是它的'NSString'属性,代表要显示的文本。如果那是正确的,那么'N SString'不会响应'setNeedsDisplay'。您可以将该消息发送给视图,但不能发送给字符串。 – 2013-03-21 08:36:08

0

我最终将UILabel组件切换到UITextfield,并神秘地将其工作完美无缺地完成了。