UItableViewCell обновляет неправильный текст метки ячейки - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть UITableView, куда я загружаю адрес из геокодера по latlng.когда я в первый раз прокручиваю таблицу, все в порядке и работает хорошо.Но проблема в том, что когда я прокручиваю вверх, все адреса теряют свою ячейку.Я имею в виду адрес 5-й ячейки, который теперь отображается на 1-й ячейке.

Это мой метод просмотра таблицы 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 голосов
/ 20 декабря 2018

Это из-за удаления из очереди

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

Я предлагаю геокодировать местоположение и изменить модель с полученным адресом, затем перезагрузить таблицу / indexPath, и это избавит вас от повторного получения того же адресаи снова, когда вы прокручиваете таблицу, просто проверьте местоположение модели, если ноль, затем запустите геокод, если нет, назначьте его метке

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
}
...