簡體   English   中英

基於 Bool 更新列表 - SwiftUI

[英]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 實例不會注冊任何更改,因此不會在ChecklistobjectWillChangePublisher中發布任何事件。

要獲取要更新的項目的視圖,您必須將項目作為@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM