Зацикливание данных JSON для MapKit не работает - PullRequest
0 голосов
/ 13 января 2020

В настоящее время я пишу свое первое более крупное приложение iOS, которое я надеюсь выпустить в ближайшем будущем. Проблема, которую я не могу решить самостоятельно, заключается в следующем:

Учитывая мой веб-сервис WebServicePins.swift Я получаю данные из своего собственного API. Это выглядит так:

[
  {
    "id": 1,
    "title": "Berlin",
    "body": "Capital of Germany",
    "thumb": "*Link to my AWS bucket*",
    "lng_coord": "13.404954",
    "lat_coord": "52.520008",
    "date": "2019-11-10T11:36:31.409361Z",
    "owner": 1,
    "type": "other"
  },
  {
    "id": 4,
    "title": "Munich",
    "body": "Home of the Oktoberfest",
    "thumb": "*Link to my AWS bucket*",
    "lng_coord": "11.576124",
    "lat_coord": "48.137154",
    "date": "2019-11-10T11:36:31.409361Z",
    "owner": 1,
    "type": "other"
  }
]

и так далее. Веб-служба работает нормально, и я использую данные в PinListViewModel.swift:

import Foundation

class PinListViewModel: ObservableObject {
   @Published var pins = [PinViewModel]()

    init() {

        WebservicePins().getPins { pins in

            if let pins = pins {
                self.pins = pins.map(PinViewModel.init)
            }
        }
    }
}

struct PinViewModel: Identifiable {

    var pin: Pin

    init(pin: Pin) {
        self.pin = pin
    }

    var id: Int {
        return self.pin.id
    }

    var title: String {
        return self.pin.title
    }

    var body: String {
        return self.pin.body
    }

    var thumb: String {
        return self.pin.thumb
    }

    var lng_coord: String {
        return self.pin.lng_coord
    }

    var lat_coord: String {
        return self.pin.lat_coord
    }

    var date: String {
        return self.pin.date
    }

    var owner: Int {
        return self.pin.owner
    }

    var type: String {
        return self.pin.type
    }

}

. Использование ObservableObject для отображения списка в представлении SwiftUI -

struct ArticlesTabView: View {

    @ObservedObject private var pinListVM = PinListViewModel()

    var body: some View {
        VStack {
            List(self.pinListVM.articles, id:  \.id) { pin in
                Text(pin.title)
            }
        }
    }
}

работает как положено однако я не могу l oop по массиву, как, например, в

func makeUIView(context: Context) -> MKMapView {

        let pinListVM = PinListViewModel()

        let mapView = MKMapView()
        mapView.delegate = context.coordinator

        // Test Annotations
        let testPins = [
            Pin(id: 1, title: "Berlin", body: "Capital of Germany",
                thumb: "", lng_coord: "13.404954", lat_coord: "52.520008", date: "",
                owner: 1, type: "action"),
            Pin(id: 2, title: "München", body: "Home of the Oktoberfest",
            thumb: "", lng_coord: "11.576124", lat_coord: "48.137154", date: "",
            owner: 1, type: "other")
        ]

        for pin in pinListVM.pins {
            let annotation = MKPointAnnotation()
            annotation.title = pin.title
            annotation.subtitle = pin.body
            annotation.coordinate = CLLocationCoordinate2D(latitude: Double(pin.lat_coord)!, longitude: Double(pin.lng_coord)!)
            mapView.addAnnotation(annotation)
        }

        for testPin in testPins {
            let annotation = MKPointAnnotation()
            annotation.title = testPin.title
            annotation.subtitle = testPin.body
            annotation.coordinate = CLLocationCoordinate2D(latitude: Double(testPin.lat_coord)!, longitude: Double(testPin.lng_coord)!)
            // annotation.pinTintColor = UIColor.green
            mapView.addAnnotation(annotation)
        }

        return mapView
    }

Отображаются testPins, а pins не отображаются на окончательной карте. Можете ли вы помочь мне найти мою ошибку? Заранее спасибо! PS: я новичок в stackoverflow.com, не стесняйтесь менять мой вопрос / скажите, как сделать его более наглядным или понятным!

1 Ответ

0 голосов
/ 13 января 2020

Похоже, вы создаете новую PinListViewModel в виде карты. Вы должны сделать это @ObservedObject, я думаю.

...