[英]Updating list based on Bool - SwiftUI
我正在嘗試創建一個清單視圖,其中包含從 a.json 解碼的項目列表,在點擊該項目時,它會將其標記為已完成。 我正在努力的是在您將項目標記為已完成時更新列表。 目前它只會在關閉視圖然后再次打開后更新。
這是視圖:
struct ChecklistView: View {
@Environment(\.presentationMode) var presentationMode
@ObservedObject var checkList: Checklist
var body: some View {
VStack {
HStack {
Text(checkList.checklist)
.font(.title)
Spacer()
Button("Close") {
presentationMode.wrappedValue.dismiss()
}
}
List(checkList.actions, id: \.id) { item in
if item.action == "" {
Text(item.name).italic()
.multilineTextAlignment(.center)
.font(.callout)
.foregroundColor(.gray)
.frame(maxWidth: .infinity)
} else {
Button(action: {
item.completed.toggle()
}) {
if item.completed {
HStack {
Image(systemName: "checkmark.square")
.foregroundColor(.green)
Text(item.name)
Spacer()
Text(item.action)
.font(.caption)
.foregroundColor(.gray)
}
} else {
HStack {
Image(systemName: "square")
Text(item.name)
Spacer()
Text(item.action)
.font(.caption)
.foregroundColor(.gray)
}
}
}
}
}
}.padding()
}
}
這是清單的 class:
class Checklist: Codable, Identifiable, ObservableObject {
enum CodingKeys: CodingKey {
case checklist
case actions
}
var id = UUID()
var checklist: String
var actions: [Action]
class Action: Codable, Identifiable, ObservableObject {
enum CodingKeys: CodingKey {
case name
case action
}
var id = UUID()
var name: String
var action: String
@Published var completed: Bool = false
}
}
任何幫助,將不勝感激。
問題出在您的Checklist
class 中——您將其設置為@ObservableObject,但您沒有可觀察的屬性(即@Published)。 相反,您有一個Action
數組,它們也是類,它們發布一個completed
的屬性。 但是,您的List
沒有看到這一點,因為它只是在查看清單上的 static actions
屬性。
我建議將您的Action
轉換為結構並使actions
成為@Published。
class Checklist: Identifiable, ObservableObject {
var id = UUID()
var checklist: String = ""
@Published var actions: [Action] = []
struct Action: Identifiable {
enum CodingKeys: CodingKey {
case name
case action
}
var id = UUID()
var name: String
var action: String
var completed: Bool = false
}
}
有警告。 一是您檢查項目的邏輯將變得更加復雜。 一種可能:
checkList.actions = checkList.actions.map {
if $0.id == item.id {
var updatedItem = item
updatedItem.completed.toggle()
return updatedItem
}
return $0
}
另一個是在 Checklist 上擁有 @Published 屬性最初會破壞Codable
。 這有很多可能性,包括將Checklist
本身存儲在不同的包裝器中,進行更多的手動解碼等。
所以,仍然需要做出一些決定,但這應該讓你開始。
SwiftUI 未觀察到 Action 實例。
更改 Action 的狀態時,Checklist 實例不會注冊任何更改,因此不會在Checklist
的objectWillChangePublisher
中發布任何事件。
要獲取要更新的項目的視圖,您必須將項目作為@ObservedObject
存儲在某處。 這可以通過將列表項的 UI 元素包裝在單獨的視圖中來實現:
struct ActionView: View {
@ObservedObject var action: Checklist.Action
init(action: Checklist.Action) {
self.action = action
}
var body: some View {
...
}
}
或者,使Action
成為一個結構,使var actions
@Published
並更改清單實例上的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.