2017-05-04 89 views
-1

我有下面的代碼有問題:斯威夫特3 - UITextView的不更新

@IBOutlet var infoBox: UITextView! 

LibPerso.startGPSLocationService(completion: {(response:Response, location:CLLocation?) -> Void in 
    if(response.hasError()){ 
     //... 
    } 
    if let currentLocation = location, location != nil, location?.coordinate.latitude != 0, location?.coordinate.longitude != 0{ 
     DispatchQueue.main.async { 
      print(self.infoBox.text) //#1 
      self.infoBox.text = "Lat : \(currentLocation.coordinate.latitude) \r\nLng: \(currentLocation.coordinate.longitude)" 
      print(self.infoBox.text) //#2 
     } 
    } 
}) 

當我打開這個觀點,並呼籲在我的圖書館方法startGPSLocationService(方法,它是一個服務來獲取GPS位置),每次我有回報時,我都成功更新了textView。
問題是,當我更改視圖(回到上一個視圖)並重新打開此視圖時,將調用所有代碼,但屏幕上未更新infoBox

我有打印兩個打印語句如下:

#1:緯度:48.7922072828896 LNG:10.16013687006524
#2:緯度:48.7922120134739 LNG:10.16015784907253

所以收件箱場正確更新,但在我的屏幕上,沒有任何反應。

我已經試過做self.infoBox.setNeedsLayout()setNeedsDisplay(),但這也不會改變任何東西。

我認爲當我回去重新打開這個視圖時,對infoBox的引用會丟失。

+0

是從另一個屏幕返回時調用的完成塊。完成塊不是方法。 ? – Priyal

+0

是的,顯示兩個「打印」,所以完成塊被稱爲 – Banana

+0

infoBox的檢查框。 – KKRocks

回答

0

這是非常有可能關係到你的這一段描寫:

當我更改視圖(返回到上一個視圖),然後重新打開這一觀點

這聽起來像你有例如,ViewControllerOne(VC1)和ViewControllerTwo(VC2)。您的infoBox位於VC2

您從VC1導航到VC2 - 可能是使用模態或推格式 - 並且您設置了infoBox的文本。

然後你導航回到VC1,並在某些時候「重新打開」VC2 ......此時,你感到驚訝的是infoBox不再包含先前設置的文本。

這是否相當準確地描述了情況?如果是這樣,那就是問題所在。當你「重新打開這一觀點」,要創建的VC2一個實例 - 這不,當然,包含您曾在infoBox設置文本。你不是簡單地重新顯示舊的。

你需要做的是將文本從VC2回傳到VC1,或者創建一些數據類來存儲你的新文本(或者更好的是存儲新的緯度/經度值) 。

+0

感謝您的回答。很好的解釋。我明白爲什麼它不工作...我的完成塊保留在以前的實例,並使用我以前的實例的收件箱.... – Banana