【问题标题】:Type '()' cannot conform to 'MapAnnotationProtocol'类型 '()' 不能符合 'MapAnnotationProtocol'
【发布时间】:2021-11-29 21:38:11
【问题描述】:

我按照thisthis 教程编写了一个演示程序,用于在 SwiftUI 中的地图上显示大头针,它没有问题。然后,当我将相同的技术应用到我的应用程序时,我收到一个类型不能符合“MapAnnotationProtocol”的错误。

这是我的代码:

import SwiftUI
import MapKit

struct MapLocationView: View {

    @ObservedObject var manager = LocationManager()

    @FetchRequest(sortDescriptors: [])

    private var meals: FetchedResults<Meal>

    var body: some View {
        Map(coordinateRegion: $manager.region, annotationItems: meals) { meal in  // error is on Map
            if (meal.latitude != 0 && meal.longitude != 0) {
                let coordinate = CLLocationCoordinate2D(latitude: meal.latitude, longitude: meal.longitude)
                MapPin(coordinate: coordinate)
            }
        }
    }
}

LocationManager 代码与教程和我编写的演示中的相同,未更改的代码。我不明白为什么它在演示中有效并且在我的应用中无效。

我尝试将代码包装在 Group {} 中,但这并没有解决问题。我读过其他包含类似错误消息的文章,但这些解决方案似乎都不适用于这种情况。

我对 Swift 和 SwiftUI 还很陌生,所以它应该在演示中工作而不是在我的应用程序中工作对我来说毫无意义。我希望我已经提供了足够的信息来解决这个问题。

【问题讨论】:

标签: swiftui mapkit


【解决方案1】:

在查看您的代码时会想到几件事:

  • Meal 是否符合 Identifiable?
  • 您的闭包应始终返回某种地图注释。

您的 MapPin(..) 应该可以工作,但看起来您需要在调用闭包之前过滤 Meal 结构数组。

以下是未经测试的代码,但无论如何可能会有所帮助。

extension Meal: Identifiable {
    var id: ObjectIdentifier {
        return ObjectIdentifier(self)
    }

}

extension Meal {
    var isValid: Bool {
        return latitude != 0 && longitude != 0
    }
    var coordinate: CLLocationCoordinate2D {
        return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}


var body: some View {
    Map(coordinateRegion: 
       $manager.region, 
       annotationItems: meals.filter { $0.isValid ) { meal in  
        MapPin(coordinate: meal.coordinate)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2022-07-05
    • 1970-01-01
    • 2022-07-23
    • 2020-11-10
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多