簡體   English   中英

"SwiftUI:綁定從環境對象派生的結構的屬性"

[英]SwiftUI: Binding on property of struct derived from environment object

我的任務管理器應用程序中有兩個結構:

struct Task {
    var identifier: String
    var title: String
    var tags: [String] // Array of tag identifiers
}
struct Tag {
    var identifier: String
    var title: String
}

不,您不一定會違反最佳實踐。 我認為在 SwiftUI 中,數據模型存儲和操作的概念很快變得比 Apple 在其演示代碼中傾向於展示的概念更加復雜。 對於一個真實的應用程序,具有單一事實來源,就像您似乎正在使用的那樣,您將不得不想出一些方法來將數據綁定到您的視圖。

一種解決方案是使用您自己的get<\/code>和set<\/code>屬性編寫Binding<\/code> ,這些屬性與您的ObservableObject<\/code>交互。 這可能看起來像這樣,例如:

struct TaskView : View {
    var taskIdentifier: String // Passed from parent view
    
    @EnvironmentObject private var taskStore: TaskStore
    
    private var taskBinding : Binding<Task> {
        Binding {
            taskStore.tasks[taskIdentifier] ?? .init(identifier: "", title: "", tags: [])
        } set: {
            taskStore.tasks[taskIdentifier] = $0
        }
    }
    
    var body: some View {
        TextField("Task title", text: taskBinding.title)
    }
}

使用值類型對數據建模並使用引用類型管理生命周期和副作用是正確的。 您缺少的一點是 Task 沒有實現Identifiable<\/code>協議,該協議使 SwiftUI 能夠跟蹤List<\/code>或ForEach<\/code>中的數據。 實現如下:

struct Task: Identifiable {
    var id: String
    var title: String
    var tags: [String] // Array of tag identifiers
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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