[英]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.