如何在MKA注释上显示核心数据中的多个项目

时间:2018-07-16 16:13:32

标签: swift xcode core-data mapkit mkannotationview

我正在尝试在Care Data的地图注释中显示多个对象。目前,我可以通过此功能获取标题和字幕以显示信息

 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数据。

通过使用此扩展名,我发现here可以在注释中添加多行。  但是,它不是来自存储在核心数据中的信息。这就是我为扩展程序设置功能的方式

 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

我对编程非常陌生,非常感谢您的帮助,并向我解释我做错了事。

1 个答案:

答案 0 :(得分:0)

'!'表示强制展开

myLength = newLength! <- CRASH

由于这里的“ newLength”为零,因此您在强制解开包装的那一行会崩溃。

例如您可以解决错误

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

另请参阅What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?