Updated for Xcode 14.2
New in iOS 15
SwiftUI lets us create a List
or ForEach
directly from a binding, which then provides the content closure with individual bindings to each element in the collection of data we’re showing. This is important for the times when the content you’re showing for each item needs a binding to some of its data, such as list rows having a text field to edit a user’s name.
To use this, pass the binding into your list directly, e.g. $users
, then accept a binding in the content closure, e.g. $user
. For example, in this code we show a list of users and add to each row a Toggle
determining whether they have been contacted or not:
struct User: Identifiable {
let id = UUID()
var name: String
var isContacted = false
}
struct ContentView: View {
@State private var users = [
User(name: "Taylor"),
User(name: "Justin"),
User(name: "Adele")
]
var body: some View {
List($users) { $user in
Text(user.name)
Spacer()
Toggle("User has been contacted", isOn: $user.isContacted)
.labelsHidden()
}
}
}
Download this as an Xcode project
Using a binding in this way is the most efficient way of modifying the list, because it won’t cause the entire view to reload when only a single item changes.
SPONSORED From March 20th to 26th, you can join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.