代表删除注释的问题

Problem with delegates removing annotation

我有两个屏幕。第一个(firstViewController)有一个带有 UITapGestureRecognizer 的 mapView。当用户点击屏幕时,将向地图添加注释并显示第二个屏幕 (secondViewController)。

当用户关闭第二个 ViewController 并返回到第一个时,注释应该被删除。我知道我必须使用委托,但我就是做不到。

这是我现在的代码:

class firstViewController: UIViewController, AnnotationDelegate {
    
    let mapView = MKMapView()

    var temporaryPinArray = [MKPointAnnotation]()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(mapView
        
        let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        mapView.addGestureRecognizer(gesture)
        secondVC.annotationDelegate = self
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        mapView.frame = view.bounds
    }
    
    @objc func handleTap(_ gestureReconizer: UILongPressGestureRecognizer) {
        let location = gestureReconizer.location(in: mapView)
        let coordinates = mapView.convert(location, toCoordinateFrom: mapView)
        mapView.removeAnnotations(mapView.annotations)       
        
                let pin = MKPointAnnotation()
        pin.coordinate = coordinates
        
        temporaryPinArray.removeAll()
        temporaryPinArray.append(pin)
        mapView.addAnnotations(temporaryPinArray)

                // Present secondViewController
        let secondVC = SecondViewController()
        panel.set(contentViewController: secondVC)
        panel.addPanel(toParent: self)
    }

        func didRemoveAnnotation(annotation: MKPointAnnotation) {
        mapView.removeAnnotation(annotation)
    }
}

第二个视图控制器

    protocol AnnotationDelegate {
        func didRemoveAnnotation(annotation: [MKPointAnnotation])
    }

class SecondViewController: UIViewController {
    
    var annotationDelegate: AnnotationDelegate!
    
    let mainVC = firstViewController()
    
    let closeButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .grey
        button.layer.cornerRadius = 15
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(closeButton)
        
        closeButton.addTarget(self, action: #selector(dismissPanel), for: .touchUpInside)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        closeButton.frame = CGRect(x: view.frame.width-50, y: 10, width: 30, height: 30)
    }
    
    @objc func dismissPanel() {
        self.dismiss(animated: true, completion: nil)
        annotationDelegate.didRemoveAnnotation(annotation: mainVC.temporaryPinArray)
    }
}

非常感谢您的帮助!

您在 SecondViewController 中创建了 firstViewController 的新实例。此实例与实际的第一个实例无关:

let mainVC = firstViewController()

这意味着 temporaryPinArray 也不同。所以不是传递这个不相关的数组...

@objc func dismissPanel() {
    self.dismiss(animated: true, completion: nil)
    annotationDelegate.didRemoveAnnotation(annotation: mainVC.temporaryPinArray)
}

只需将函数更改为不带参数即可:

protocol AnnotationDelegate {
    func didRemoveAnnotation() /// no parameters
}

@objc func dismissPanel() {
    self.dismiss(animated: true, completion: nil)
    annotationDelegate.didRemoveAnnotation() /// no parameters
}

并在 firstViewControllerdidRemoveAnnotation 中引用实际的 temporaryPinArray.

func didRemoveAnnotation() {
    mapView.removeAnnotations(temporaryPinArray) /// the current array
}