如何在 MKAnnotation 上显示来自核心数据的多个项目

How to show multiple items from Core Data on an MKAnnotation

我正试图在我的地图注释上显示来自 Care Data 的多个 objects。目前,我可以通过此功能获取标题和副标题来显示信息

 func getData() -> [MKAnnotation]? {





        do {
            storedLocations = try context.fetch(Fish.fetchRequest())
            var annotations = [MKAnnotation]()
            for storedLocation in storedLocations {
                let newAnnotation = MyAnnotation(coordinate: CLLocationCoordinate2D(latitude: storedLocation.latitude, longitude: storedLocation.longitude))
                newAnnotation.coordinate.latitude = storedLocation.latitude
                newAnnotation.coordinate.longitude = storedLocation.longitude
                newAnnotation.title = storedLocation.species
                newAnnotation.subtitle = storedLocation.length
                newAnnotation.newTime = storedLocation.time
                newAnnotation.newBait = storedLocation.bait
                newAnnotation.newNotes = storedLocation.notes
                newAnnotation.newWaterTempDepth = storedLocation.water
                newAnnotation.newWeatherCond = storedLocation.weather




              // print(storedLocation.length)
                let newLength = storedLocation.length
                let newTime = newAnnotation.newTime
//                let newBait = storedLocation.bait
//                let newNotes = storedLocation.notes
//                let newWaterTempDepth = storedLocation.water
//                let newWeatherCond = weatherCond

                myLength = newLength!
                myTime = newTime!

//

                annotations.append(newAnnotation)





            }

            return annotations
        }
        catch {
            print("Fetching Failed")
        }
        return nil
    }

我正在尝试在注释上显示所有 storedLocation 数据。

通过使用此扩展,我发现 我能够向注释添加多行。 但是,它不是来自存储在核心数据中的信息。这就是我为扩展

设置函数的方式
 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else {
            return nil
        }

        let reuseIdentifier = "pin"
        var annotationView = map.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)


        if annotationView == nil {
            annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
            annotationView?.canShowCallout = true

            annotationView?.loadCustomLines(customLines: [myLength, myTime])


        } else {
            annotationView?.annotation = annotation
        }


        annotationView?.image = UIImage(named: "fish")


         return annotationView

这是扩展名。

 extension MKAnnotationView {

    func loadCustomLines(customLines: [String]) {
        let stackView = self.stackView()
        for line in customLines {
            let label = UILabel()
            label.text = line
            stackView.addArrangedSubview(label)
        }
        self.detailCalloutAccessoryView = stackView
    }



    private func stackView() -> UIStackView {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .fillEqually
        stackView.alignment = .fill
        return stackView
    }
}

这是我的注释

    import UIKit
    import MapKit

    class MyAnnotation: NSObject, MKAnnotation {

    var coordinate: CLLocationCoordinate2D
    var title: String?
    var subtitle: String?
    var newLength: String?
    var newTime: String?
    var newBait: String?
    var newNotes: String?
    var newWaterTempDepth: String?
    var newWeatherCond: String?
    var detailCalloutAccessoryView: UIStackView?



      init(coordinate: CLLocationCoordinate2D){
        self.coordinate = coordinate
    }


   }

当我 运行 我得到 this

我是编程的新手,非常感谢任何帮助,以及对我做错了什么的解释提前谢谢你

'!'表示强制展开

myLength = newLength! <- CRASH

由于 'newLength' 在这里为 nil,您将在强制解包的行上发生崩溃。

例如您可以修复错误

myLength = newLength ?? 0
myTime = newTime ?? 0

另见