Since Swift 5.5 we could create SwiftUI lists with bindings like this (e.g. see this answer):
class Item {
// ...
var isOn: Bool
}
struct ContentView: View {
@State private var items: [Item] = []
var body: some View {
NavigationView {
List {
ForEach($items) { $item in // <--- list binding
Toggle(isOn: $item.isOn) {
Text("Vibrate on Ring")
}
}
}
}
}
}
Now I want to do something similar with SwiftData but I get an error:
struct ContentView: View {
@Environment(.modelContext) private var modelContext
@Query private var items: [Item]
var body: some View {
NavigationView {
List {
ForEach($items) { $item in // <--- Cannot find '$items' in scope
// ...
How can I render a list of SwiftData objects that allows inline editing of objects through bindings?
2
Answers
The easiest solution I found is to use @Bindable and to separate the
Query
macro and theBindable
into different views.An example
Calling view
You can utilize the new
Bindable
, which has a subscript operator to wrap the underlying data into a binding variable: