模型
我在旅行中有不同的變數。
import Foundation
struct Travel: Identifiable, Codable {
var id = UUID()
var name: String
var date = Date()
var location: String
var isFav: Bool
var score: Float
var comment: String
}
查看模型
我使用 UserDefaults 加載和保存資料。總是它的作業,但在這個模型中不是。
import Foundation
class TravelViewModel: ObservableObject {
@Published var travelList = [Travel] ()
@Published var travelled = 0
init(){
load()
}
func load() {
guard let data = UserDefaults.standard.data(forKey: "travelList"),
let savedTravels = try? JSONDecoder().decode([Travel].self, from: data) else { travelList = []; return }
travelList = savedTravels
}
func save() {
do {
let data = try JSONEncoder().encode(travelList)
UserDefaults.standard.set(data, forKey: "travelList")
} catch {
print(error)
}
}
}
添加專案視圖
我有 addItems 函式并在 addItem 按鈕中使用這個函式。
import SwiftUI
struct AddTravelView: View {
@StateObject var VM = TravelViewModel()
@State var name = ""
@State var location = ""
@State var isFav = false
@State var score = 0.00
@State var comment = ""
var body: some View {
VStack {
ZStack {
Rectangle()
.fill(.black.opacity(0.2))
.cornerRadius(20)
.frame(width: 350, height: 350)
VStack{
HStack {
Text("Name:")
.font(.system(size: 16 , weight: .medium))
TextField("Type..", text: $name)
}
HStack {
Text("Location:")
.font(.system(size: 16 , weight: .medium))
TextField("Type..", text: $location)
}
HStack {
Text("Score: \(Int(score))")
.font(.system(size: 16 , weight: .medium))
Slider(value: $score, in: 0...10, step: 1)
}
Spacer()
ZStack(alignment: .topLeading) {
Rectangle()
.fill(.white)
.cornerRadius(20)
.frame(height: 200)
VStack(alignment: .leading) {
TextField("Comment...", text: $comment, axis: .vertical)
}.padding()
}
}
.padding()
.frame(width: 300, height: 200)
}
Button {
addTravel()
} label: {
ZStack{
Rectangle()
.fill(.black.opacity(0.2))
.cornerRadius(20)
.frame(width: 350 , height: 100)
Text("ADD TRAVEL")
.font(.system(size: 25, weight: .medium, design: .monospaced))
.foregroundColor(.black)
}.padding()
}
}
}
func addTravel(){
VM.travelList.append(Travel(name: name, location: location, isFav: isFav, score: Float(score), comment: comment))
}
}
struct AddTravelView_Previews: PreviewProvider {
static var previews: some View {
AddTravelView()
}
}
最近添加視圖
在此頁面中,我想查看我之前添加的專案
import SwiftUI
struct RecentTravels: View {
@StateObject var VM = TravelViewModel()
var body: some View {
VStack {
ForEach(VM.travelList) {Travel in
HStack{
Image(systemName: "questionmark")
.frame(width: 50, height: 50)
.padding()
.overlay {
RoundedRectangle(cornerRadius: 5)
.stroke(.black, lineWidth: 2)
}
VStack(alignment: .leading) {
Text(Travel.name)
.font(.subheadline)
.bold()
.lineLimit(1)
Text("\(Travel.date)")
.font(.footnote)
.opacity(0.9)
.lineLimit(1)
}
Spacer()
VStack {
Image(systemName: "heart")
Spacer()
Text("\(Travel.score)")
}
.frame(height: 50)
.font(.system(size: 22))
}
}
}
}
}
struct RecentTravels_Previews: PreviewProvider {
static var previews: some View {
RecentTravels()
}
}
和內容視圖
并在 ContentView 中呼叫這兩個視圖。
import SwiftUI
struct ContentView: View {
@StateObject var VM = TravelViewModel()
var body: some View {
VStack {
AddTravelView()
RecentTravels()
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
當我只在 ContentView 中撰寫所有代碼時,它是有效的,但是當我呼叫另一個頁面時它不起作用。通常當我按下添加專案按鈕并重新啟動應用程式時它可以作業,但現在它什么都沒有。它甚至無法重新啟動應用程式。
uj5u.com熱心網友回復:
您遇到的問題是您有多個VM,彼此沒有關系。你不能有超過一個source of truth
。@StateObject var VM = TravelViewModel()
保留您在 中的一個ContentView,并將其傳遞給另一個視圖,如下所示
VStack {....}.environmentObject(VM):
在您的AddTravelViewandRecentTravels中,添加@EnvironmentObject var VM: TravelViewModel而不是@StateObject var VM = TravelViewModel().
查看此鏈接,它為您提供了一些有關如何在應用程式中管理資料的好示例:
https ://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532909.html
標籤:IOS迅捷
上一篇:入口點沒有改變
