我有一个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"
}
}
}) } }
答案 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
}