类型的价值' UIViewController'没有会员' mapView'

时间:2018-01-10 23:18:03

标签: ios swift mapkit

这是我在util文件中的功能。它抱怨"类型的价值' UIViewController'没有会员' mapView'"

func removeSpecificCustomAnnotation(annotationArray: [CustomPointAnnotation], annotationIdToRemove: String, viewController: UIViewController) {
    for annotation in annotationArray {
        if let ID = annotation.locationID, ID == annotationIdToRemove {
            viewController.mapView.removeAnnotation(annotation)
        }
    }
}

我不能再回答了。我在这里发布我的工作

这是工作功能。我想删除地图上的注释

  1. 在我的viewController.swift
  2. 声明var mapView = MKMapView()
  3. 显示所有注释的功能 - >我不放在这里
  4. 现在,我想删除上面显示的注释之一
  5. 我有注释的ID(您需要使用自定义注释来执行此操作)
  6. 注释的ID由基于纬度和经度的函数生成
  7. 现在,我需要找到具有该ID的注释并将其删除
  8. 我在地图上收到所有注释

    让注释= mapView.annotations.filter {             $ 0!== self.mapView.userLocation         }

  9. 循环注释数组,然后删除我需要的那个

    for annotation in annotations {
    
        let getLat: CLLocationDegrees = annotation.coordinate.latitude
        let getLon: CLLocationDegrees = annotation.coordinate.longitude
    
        let cllocation: CLLocation =  CLLocation(latitude: getLat, longitude: getLon)
    
        let locationID = Utils.generateLocationID(newcllocation: cllocation, existingCllocationToEdit: nil)
    
        if locationID == annotationIdToRemove {
            self.mapView.removeAnnotation(annotation)
        }
    
    
    }
    

2 个答案:

答案 0 :(得分:1)

错误告诉你非常具体的错误。您的函数removeSpecificCustomAnnotation()采用viewController类型的参数UIViewController。它是通用的UIViewControllerUIViewController个对象没有mapView属性。你不得不告诉编译器你的视图控制器是某种视图控制器,确实具有mapView属性。

你可以使你的视图控制器成为UIViewController的自定义子类,正如Farid在他的回答中所建议的那样。但是,这意味着此函数只能接受该类或子类的视图控制器。

相反,我建议定义一个协议,说明符合此协议的对象具有mapView类型的变量MKMapView":

protocol HasMapView {
  var mapView: MKMapView { get }
}

编辑:

我的原始答案使用了泛型,但Rob的答案更好,所以我编辑我的答案以采用他的关键部分:

//I don't know what your CustomPointAnnotation class is;
//The below makes the function compile
class CustomPointAnnotation: NSObject {
}

func removeSpecificCustomAnnotation(
  annotationArray: [CustomPointAnnotation],
  annotationIdToRemove: String,
  viewController: UIViewController & HasMapView) {
    print("\(viewController.mapView)")
}

表达式UIViewController & HasMapView告诉编译器viewController参数是符合HasMapView属性的任何UIViewController,因此保证它具有类型{的变量mapView {1}}。

编辑#2:

您的参数类型为MKMapView,但在您的代码中没有任何要求它是视图控制器的东西。如果这真的是你的所有功能,你可以删除那个要求,并使参数只是一个符合HasMapView协议的对象,而不要求它是一个视图控制器:

UIViewController

答案 1 :(得分:0)

假设您有一个具有UIViewController属性的自定义mapView子类,并且此函数中的viewController参数类型是您的自定义UIViewController子类,则需要将viewController参数类型更改为函数声明中的自定义视图控制器子类名称:

func removeSpecificCustomAnnotation(annotationArray: [CustomPointAnnotation], annotationIdToRemove: String, viewController: YourCustomViewController) {

}