Как показать несколько элементов из Core Data в MKAnnotation

Я пытаюсь показать несколько объектов в аннотациях карты из 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
    }

Я пытаюсь показать все данные storeLocation в аннотации.

Используя это расширение, я нашел здесь, я могу добавить несколько строк в аннотацию. Однако это не из информации, хранящейся в основных данных. Вот как я настроил функцию для расширения

 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
    }


   }

Когда я запускаю, я получаю это

Я очень новичок в программировании и был бы очень признателен за любую помощь, а также за объяснение того, что я делаю неправильно. Спасибо заранее.


person jesseCampeez    schedule 16.07.2018    source источник


Ответы (1)


'!' означает Force Unwrapping

myLength = newLength! <- CRASH

Поскольку «newLength» здесь равен нулю, вы получите сбой в строке, где вы принудительно развернете ее.

например Вы можете исправить ошибку

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

См. также Что означает фатальная ошибка: неожиданно нашел ноль при развертывании необязательного значения означает?

person Kosuke Ogawa    schedule 17.07.2018
comment
это чтение действительно помогло мне лучше понять факультативы. Однако это также создало больше ошибок, чем я начал. Я застрял на этом больше недели и чувствую себя совершенно потерянным. - person jesseCampeez; 17.07.2018
comment
Я перечитал ссылку и, наконец, понял свою ошибку! Я не установил var myLength: String = в необязательный var myLength: String? = Это и кое-какая серьезная очистка после того, что я узнал, теперь отлично работает! - person jesseCampeez; 17.07.2018