gpt4 book ai didi

ios - 类型 'UIViewController' 的值没有成员 'mapView'

转载 作者:可可西里 更新时间:2023-11-01 01:58:55 25 4
gpt4 key购买 nike

这是我在 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)
}
}
}

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

这是工作函数。我想删除 map 上的注释

  1. 在我的 viewController.swift 中
  2. 声明 var mapView = MKMapView()
  3. 显示所有注释的功能 -> 我没有放在这里
  4. 现在,我想删除上面显示的注释之一
  5. 我有注释的ID(你需要使用自定义注释来做到这一点)
  6. 标注的ID是根据经纬度函数生成的
  7. 现在,我需要找到具有该 ID 的注释并将其删除
  8. 我得到了 map 上的所有注释

    让注解 = 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)
    }


    }

最佳答案

该错误非常明确地告诉您出了什么问题。您的函数 removeSpecificCustomAnnotation() 采用 UIViewController 类型的参数 viewController。它是一个通用的 UIViewControllerUIViewController 对象没有 mapView 属性。您必须以某种方式告诉编译器您的 View Controller 是某种确实具有mapView属性的 View Controller 。

您可以将 View Controller 设为 UIViewController 的自定义子类,正如 Farid 在他的回答中所建议的那样。但是,这意味着此函数只能获取该类或子类的 View Controller 。

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

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 类型为 MKMapView

编辑#2:

您的参数类型为 UIViewController,但在您的代码中没有任何内容要求它是 View Controller 。如果这真的是你的全部功能,你可以删除那个要求,并使参数只是一些符合 HasMapView 协议(protocol)的对象,而不要求它是一个 View Controller :

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

关于ios - 类型 'UIViewController' 的值没有成员 'mapView',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com