2017-05-04 74 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