2013-03-20 65 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,並神祕地將其工作完美無缺地完成了。