Ios UILabel内容未刷新
我正在调用json/rest服务,并将返回的数据传递给屏幕上的UILabel。我的屏幕由一个静态分组表组成,其中有许多带有标题和详细信息的单元格。使用返回的内容设置uilabel.text后,屏幕不会显示值,但如果我点击uilabel,则会显示值。似乎我缺少刷新屏幕的命令。在回调块中从json/rest服务接收数据后,从viewDiDLoad方法调用下面的代码Ios UILabel内容未刷新,ios,objective-c,Ios,Objective C,我正在调用json/rest服务,并将返回的数据传递给屏幕上的UILabel。我的屏幕由一个静态分组表组成,其中有许多带有标题和详细信息的单元格。使用返回的内容设置uilabel.text后,屏幕不会显示值,但如果我点击uilabel,则会显示值。似乎我缺少刷新屏幕的命令。在回调块中从json/rest服务接收数据后,从viewDiDLoad方法调用下面的代码 [MEUser retrieveLoggedUserDetails:^(MEUser *meUser, NSError *error)
[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;
});
}
}];
任何帮助都将不胜感激
非常感谢,,
Marcos答案就在代码本身。当您分派_async时,{}内的代码不会快速执行。相反,viewDidLoad将立即返回。有时之后,会出现以下行:
self.firstname.text = meUser.firstname;
根据您的描述,我猜可能会发生这样的情况:当您单击(轻触)标签时,您正在强制主队列清除其挂起的任务,其中一个任务可能在上面的代码中。所以它将值放入标签中,并显示给您
您需要决定何时刷新标签,然后只希望它保存更新的文本。在设置文本后尝试此操作
[self.firstname setNeedsDisplay];
最后,我将UILabel组件切换到UIExtField,神奇的是,它工作得完美无缺。您必须以独占方式从主线程调用UIKit。如果执行失败,则程序将调用未定义的行为。dispatch_get_main_queue()表示我正在从主线程调用,否?是否检查self.firstname是否为nil?它不是nil,值firstname将传递给对象。我可以保证这一点,因为当我点击UILabel后,就会显示内容简单。似乎当我点击UIlabel时,整个东西都会刷新。这会引发一个异常。你的意思是
[self.firstname setNeedsDisplay]
@HermannKlecker有什么原因会导致异常吗?我只是好奇。块中的代码在主队列本身上执行,尽管是异步的。那么异常的原因是什么呢?我只是假设self是一个视图控制器,firstname是UILabel,text是它的NSString
属性,表示要显示的文本。如果正确,则NSString
将不会响应setNeedsDisplay
。您可以将该消息发送到视图,但不能发送到字符串。@HermannKlecker感谢您的提醒,这就是我的意思。我没有领会您最后的想法“您需要决定何时刷新标签,然后只希望它保存更新的文本。”“我的意思是负责查看更新值的代码。”(更新值后应立即调用[self.firstname setNeedsDisplay])。我在更新值后尝试了setNeedsDisplay命令,但无效。