删除包含等于tableView textLabel的标题的注释

时间:2017-08-26 00:14:07

标签: ios swift uitableview annotations

更新

我仍然是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中

2 个答案:

答案 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个视图控制器。