私は初心者です(そして、私のコード/モデルは現在それを表示するので、私に気楽に行ってください!)。
レシピ スタイル (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)
} }