这是我在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)
}
}
}
我不能再回答了。我在这里发布我的工作
这是工作功能。我想删除地图上的注释
我在地图上收到所有注释
让注释= mapView.annotations.filter { $ 0!== self.mapView.userLocation }
循环注释数组,然后删除我需要的那个
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)
}
}
答案 0 :(得分:1)
错误告诉你非常具体的错误。您的函数removeSpecificCustomAnnotation()
采用viewController
类型的参数UIViewController
。它是通用的UIViewController
,UIViewController
个对象没有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}}。
您的参数类型为MKMapView
,但在您的代码中没有任何要求它是视图控制器的东西。如果这真的是你的所有功能,你可以删除那个要求,并使参数只是一个符合HasMapView协议的对象,而不要求它是一个视图控制器:
UIViewController
答案 1 :(得分:0)
假设您有一个具有UIViewController
属性的自定义mapView
子类,并且此函数中的viewController
参数类型是您的自定义UIViewController
子类,则需要将viewController
参数类型更改为函数声明中的自定义视图控制器子类名称:
func removeSpecificCustomAnnotation(annotationArray: [CustomPointAnnotation], annotationIdToRemove: String, viewController: YourCustomViewController) {
}