0

私は初心者です(そして、私のコード/モデルは現在それを表示するので、私に気楽に行ってください!)。

レシピ スタイル (cenotes) アプリの作成に初めて取り組んでいます。

データを更新できるように、リモート json ファイルがあるため、ユーザーは更新されたデータを取得するために再インストールする必要がありません。

アプリはデータを正常に取得して解析します (これは成功です!)が、最初にインストールしたときのみです。

その後、オンラインで変更されたデータは更新されません。.onAppear と .refreshable を使用してみましたが失敗しました。更新されたデータを取得するには、アプリを削除して再インストールする必要があります。

以下は、私のファイルの編集済みバージョンの一部です。@StateObject/@EnvironmentObject または同様のものが間違っていると思いますが、エラーを見つけることはできません。

Locations.swift

import Foundation

class Locations: ObservableObject {
    @Published var locations = [Location]()
        
    init() {
        load()
    }
    
    func load() {
        let url = URL(string: "https://www.i-love-tulum.com/cenotes/locations.json")!
               URLSession.shared.dataTask(with: url) {(data,response,error) in
                   do {
                       if let d = data {
                           let data = try JSONDecoder().decode([Location].self, from: d)
                           DispatchQueue.main.async {
                               self.locations = data
                           }
                       } else {
                           print("No Data")
                       }
                   } catch {
                       print ("Error")
                   }
               }.resume()
    } }

Location.swift - VM

import Foundation

struct Location: Codable, Identifiable {
    var id: String
    let heroPicture: String
    }

App.swift - アプリはこのタブ ビューで開きます

import SwiftUI

@main struct App: App {
    @StateObject var locations = Locations()
    @State private var selection = 1
        
    var body: some Scene {
        WindowGroup {
            TabView (selection:$selection) {
                NavigationView {
                    ListView()
                }
                .tabItem {
                    Image(systemName: "drop.circle")
                    Text("Cenotes")
                } .tag(1)
            }
            .environmentObject(locations)
        }
    } }

ListView.swift - 最初に選択されたタブはこのビューです - これらの場所は最初のインストール後に更新されません:

import SwiftUI import MapKit

struct ListView: View {
    @EnvironmentObject var locations: Locations
          
    var body: some View {
        VStack {         
            GeometryReader { geo in
                ScrollView {
                    LazyVStack (alignment: .leading) {
                        ForEach (locations: locations.locations) { location in
                               NavigationLink (
                                    destination: ContentView(location: location),
                                    label: { 
                    Image(location.heroPicture)
                    }
            .navigationTitle("Cenotes")
            .navigationBarTitleDisplayMode(.inline)
    } }
4

2 に答える 2