這是模型和視圖模型。我正在使用 UserDefaults 來保存資料。
import Foundation
struct Item: Identifiable, Codable {
var id = UUID()
var name: String
var int: Int
var date = Date()
}
class ItemViewModel: ObservableObject {
@Published var ItemList = [Item] ()
init() {
load()
}
func load() {
guard let data = UserDefaults.standard.data(forKey: "ItemList"),
let savedItems = try? JSONDecoder().decode([Item].self, from: data) else { ItemList = []; return }
ItemList = savedItems
}
func save() {
do {
let data = try JSONEncoder().encode(ItemList)
UserDefaults.standard.set(data, forKey: "ItemList")
} catch {
print(error)
}
}
}
這就是觀點。我也在嘗試添加新專案并按日期對它們進行排序。之后在 totalNumber 上添加數字。我在 ForEach 中嘗試了 .sorted() 但它不適用于按日期排序。我嘗試創建一個用于添加數字的函式,但該函式不起作用。
import SwiftUI
struct ContentView: View {
@State private var name = ""
@State private var int = 0
@AppStorage("TOTAL_NUMBER") var totalNumber = 0
@StateObject var VM = ItemViewModel()
var body: some View {
VStack(spacing: 30) {
VStack(alignment: .leading) {
HStack {
Text("Name:")
TextField("Type Here...", text: $name)
}
HStack {
Text("Number:")
TextField("Type Here...", value: $int, formatter: NumberFormatter())
}
Button {
addItem()
VM.save()
name = ""
int = 0
} label: {
Text ("ADD PERSON")
}
}
.padding()
VStack(alignment: .leading) {
List(VM.ItemList) { Item in
Text(Item.name)
Text("\(Item.int)")
Text("\(Item.date, format: .dateTime.day().month().year())")
}
Text("\(totalNumber)")
.padding()
}
}
}
func addItem() {
VM.ItemList.append(Item(name: name, int: int))
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
uj5u.com熱心網友回復:
首先,請始終以小寫字母開頭命名變數,例如
@Published var itemList = [Item] ()
@StateObject var vm = ItemViewModel()
要在視圖模型中按日期對專案進行排序,請替換
itemList = savedItems
和
itemList = savedItems.sorted{ $0.date < $1.date }
為了顯示今天專案的所有int屬性的總和,在視圖模型中添加一個和一個計算值的方法。在和中呼叫此方法@Published var totalNumberloadsave
class ItemViewModel: ObservableObject {
@Published var itemList = [Item] ()
@Published var totalNumber = 0
init() {
load()
}
func load() {
guard let data = UserDefaults.standard.data(forKey: "ItemList"),
let savedItems = try? JSONDecoder().decode([Item].self, from: data) else { itemList = []; return }
itemList = savedItems.sorted{ $0.date < $1.date }
calculateTotalNumber()
}
func save() {
do {
let data = try JSONEncoder().encode(itemList)
UserDefaults.standard.set(data, forKey: "ItemList")
calculateTotalNumber()
} catch {
print(error)
}
}
func calculateTotalNumber() {
let todayItems = itemList.filter{ Calendar.current.isDateInToday($0.date) }
totalNumber = todayItems.map(\.int).reduce(0, )
}
}
在視圖中洗掉該@AppStorage行,因為該值是按需計算并替換
Text("\(totalNumber)")
和
Text("\(vm.totalNumber)")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532912.html
標籤:IOS迅捷
