如何在UITableView单元格传递位置,点击跳转至对应位置?
问题解决思路及代码修正
问题根源分析
点击单元格后绘制所有位置连线的问题,主要来自两处:
- 单元格创建时重复调用批量位置查询逻辑,导致
locationArray被反复赋值为全量区域数据(虽不影响索引取值,但冗余且易引发异步逻辑混乱); - 地图控制器收到选中通知时,未做「仅展示当前选中区域」的处理,错误遍历所有位置绘制连线。
代码修正步骤
1. 移除单元格创建中的冗余逻辑
在tableView(_:cellForRowAt:)里,每次创建单元格都调用批量查询完全没必要——你的坐标是固定值,不需要反复请求。直接删掉这段代码:
// 删掉这段冗余逻辑 // LocationManger.sharedLocationManager.findLocations(with: countryArray, coordinates: coordinates) { location in // self.locationArray = location // print("the current location is(location)") // }
2. 提前初始化位置数组
在控制器viewDidLoad中一次性初始化locationArray,避免重复异步请求:
override func viewDidLoad() { super.viewDidLoad() // 一次性加载所有区域的位置数据 LocationManger.sharedLocationManager.findLocations(with: countryArray, coordinates: coordinates) { location in self.locationArray = location } // 其他初始化操作(如注册cell、设置tableView代理等) }
3. 修正地图控制器的选中处理逻辑
确保地图控制器收到选中通知时,只处理当前选中区域,清除之前的标注和连线:
// 地图控制器的代理实现示例 func SearchLocationController(_ controller: SearchLocationController, didSelectLocationWith location: CLLocationCoordinate2D) { // 清除地图上已有的标注和折线 mapView.removeAnnotations(mapView.annotations) mapView.removeOverlays(mapView.overlays) // 添加选中区域的标注 let selectedAnnotation = MKPointAnnotation() selectedAnnotation.coordinate = location mapView.addAnnotation(selectedAnnotation) // 移动地图到选中区域 let targetRegion = MKCoordinateRegion(center: location, latitudinalMeters: 10000, longitudinalMeters: 10000) mapView.setRegion(mapView.regionThatFits(targetRegion), animated: true) // 如果需要绘制连线(比如从用户位置到选中区域),仅绘制当前选中的这条,不要遍历所有位置 // 示例代码: // if let userLocation = mapView.userLocation.location { // let polyline = MKPolyline(coordinates: [userLocation.coordinate, location], count: 2) // mapView.addOverlay(polyline) // } }
4. 可选:直接用坐标数组传递位置
如果LocationManger的findLocations只是简单包装坐标为位置对象,你甚至可以跳过locationArray,点击时直接取coordinates数组的对应元素:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { currentLocationTableView.deselectRow(at: indexPath, animated: false) let selectedCoordinate = coordinates[indexPath.row] self.delegate?.SearchLocationController(self, didSelectLocationWith: selectedCoordinate) }
这样能彻底避免locationArray带来的异步赋值问题。
内容的提问来源于stack exchange,提问作者user20763863
相关产品推荐
相关产品推荐

