更新
我仍然是Swift的新手,所以请耐心等待。我有两个ViewControllers。一个包含mapView,当我添加注释时,annotation.title / annotation.subtitle会自动添加到第二个VC上的列表中。经过几天的研究,到目前为止我有这个:
我创建了一个用于存储列表项的全局数组,以及一个用于存储注释的全局Dictionary和一个用于表示mapView表示的ViewController的var
var annotationList = [String]()
var listDetail = [String]()
var annotationDict = [String: MKAnnotation]()
var mapViewController = MapViewController?
当我在MapViewController中创建注释时,它会自动添加到各自的数组和字典中。
// drop a map pin
extension MapViewController: HandleMapSearch {
func dropPinZoomIn(placemark:MKPlacemark){
// cache the pin
selectedPin = placemark
// add pin and add it to the list
let annotation = MKPointAnnotation()
annotation.coordinate = placemark.coordinate
annotation.title = placemark.name
if let streetNumber = placemark.subThoroughfare,
let city = placemark.locality,
let state = placemark.administrativeArea {
annotation.subtitle = "\(streetNumber) \(city) \(state)"
}
mapView.addAnnotation(annotation)
let span = MKCoordinateSpanMake(0.01, 0.01)
let region = MKCoordinateRegionMake(placemark.coordinate, span)
mapView.setRegion(region, animated: true)
annotationList.append(annotation.title!)
listDetail.append(annotation.subtitle!)
annotationDict.updateValue(annotation, forKey: annotation.title!)
print(annotationDict)
}
}
现在在我的ListViewController中,我启用了删除选项(这就是我被困的地方)。我希望能够从列表中删除该项目以及相应的注释。我已将代码更新为建议内容:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
// Get the title of the item at the selected row, and remove it from the array
let titleToRemove = annotationList.remove(at:indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
// Use the title to find the annotation to remove
if let annotation = annotationDict[titleToRemove] {
print (annotation)
mapViewController?.mapView.removeAnnotation(annotation)
}
}
}
我打印了annotationDict和注释变量,MKAnnotation值都匹配,但是,removeAnnotation似乎没有运行,项目从列表中删除,但相应的图钉保留在地图上。
这里可能存在什么问题,我该如何解决? Lmk如果有什么令人困惑的话
更新
通过自定义TabVC将两个VC实例化(使用故事板ID),并将MapVC作为所选索引0,从而首先将其放在屏幕上。用户可以使用标签栏在两个VC之间自由切换。标签栏有2个按钮(一个用于MapVC,一个用于ListVC),两个按钮都连接到IBAction
,代码如下:
// get access to the previous and current tab button
let previousIndex = selectedIndex
selectedIndex = sender.tag
// remove the previous ViewController and Set Button State
buttons[previousIndex].isSelected = false
let previousVC = viewControllers[previousIndex]
previousVC.willMove(toParentViewController: nil)
previousVC.view.removeFromSuperview()
previousVC.removeFromParentViewController()
// add the new ViewController and Set Button State
sender.isSelected = true
let vc = viewControllers[selectedIndex]
addChildViewController(vc)
vc.view.frame = contentView.bounds
contentView.addSubview(vc.view)
vc.didMove(toParentViewController: self)
我不确定它是否相关,但MapVC和ListVC也嵌入到NavBarController中
答案 0 :(得分:0)
错误几乎是自我解释的。 对于第一个错误,它说if语句需要有一个布尔条件。 对于第二个错误,您必须使用字典的值而不是字典本身。所以你可以做到
MapViewController().mapView.removeAnnotations(filteredAnnotations.value)
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
annotationList.remove(at: indexPath.row)
tableView.reloadData()
let cell = self.tableView.cellForRow(at: indexPath)
var text = cell?.textLabel
if let value = annotationDict[key] {
MapViewController().mapView.removeAnnotations(value)
}
}
}
尝试使用此方法!
答案 1 :(得分:0)
好的,看起来你有一本保存注释的字典,标题为关键字。没关系,只要你确定你的标题永远是唯一的。
重写你的删除功能:
override func tableView(_ tableView: UITableView,
commit editingStyle: UITableViewCellEditingStyle,
forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
//Get the title of the item at the selected row, and remove it
//from the array
let titleToRemove = annotationList.remove(at: indexPath.row)
//Tell the table view to reload (There are better ways to do this.)
tableView.reloadData()
//Use the title to find the annotation to remove
if let annotation = annotationDict.removeValue(forKey: titleToRemove) {
myMapViewController.mapView.removeAnnotation(annotation)
}
}
}
请注意,您的原始代码为MapViewController().mapView.removeAnnotation(annotation)
。那是错的。构造MapViewController()
创建一个全新的空地图视图控制器,该控制器不在屏幕上且不包含任何注释。
相反,您需要一个指针返回原始地图视图控制器。为此,您必须解释如何创建2个视图控制器。