UItableViewCell更新错误的单元格标签文本

时间:2018-12-20 11:27:53

标签: ios swift uitableview geocoding

我有一个UITableView,在这里我通过latlng从Geocoder加载地址。 当我第一次向下滚动tableview时,一切都很好并且工作得很好。 但是问题是当我向上滚动时,所有地址都丢失了其单元格。我的意思是 现在在第一个单元格上显示的第五个单元格的地址。

这是我的cellForRowAt表视图方法

        let cell  = self.mytableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! HomeCell
        let position = indexPath.row
        let data         =  mVehicleList[position]
        getAddress(lat: data.latitude.toD(), lng: data.longitude.toD(), text: cell.lbAddress)
        // getAddress is extenstion of ViewCOnroller which is give addres of latlng

这是我的getAddress(lat,lng,label)扩展名

extension UIViewController {

    func getAddress(lat:Double,lng :Double, text : UILabel)
    {

        let location = CLLocation(latitude: lat, longitude: lng)
        CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in

            if(placemarks != nil){
                if placemarks!.count > 0 {
                    let pm = placemarks![0]

                    if(pm.subLocality != nil && pm.subAdministrativeArea != nil)
                    {
                        text.text = pm.subLocality!+" "+pm.subAdministrativeArea!

                    }else{
                        guard let addressDict = placemarks?[0].addressDictionary else {

                            return
                        }


                        if let formattedAddress = addressDict["FormattedAddressLines"] as? [String] {

                            text.text = formattedAddress.joined(separator: ", ")

                        }
                    }


                }else{
                    text.text = "No address found"
                }
            }
})   } }

1 个答案:

答案 0 :(得分:1)

这是因为出队

if let addr = data.addressText {
   cell.lbAddress.text = addr
}
else {
  getAddress(indexPath.row,lat: data.latitude.toD(), lng: data.longitude.toD(), text: cell.lbAddress)
 }

我建议对位置进行地理编码,并使用检索到的地址更改模型,然后重新加载table / indexPath,这样可以避免您在滚动表时一次又一次地获得相同的地址,只需检查模型的位置是否nil然后开始地理编码,如果没有,则将其分配给标签

func getAddress(_ index:Int,lat:Double,lng :Double, text : UILabel) {
    ///
     mVehicleList[index].addressText = formattedAddress.joined(separator: ", ")
     // reload table/index
 }


class model {

 var state:State = .none

  func geocode(){

    gurad state == .none else { return }

    state = .geocoding

     CLGeocoder().reverseGeocodeLocation//// {

          state = .geocoded // if success
     }
  }
}
enum State {
 case geocoding,gecoded,none
}