Updated for Xcode 12.0
SwiftUI doesn’t have a direct equivalent of the didSelectRowAt
method of UITableView
, but it doesn’t need one because we can combine NavigationLink
with a list row and get the behavior for free.
We need to put together a list with some content we can work with. First, we need some sort of data to show:
struct Restaurant: Identifiable {
var id = UUID()
var name: String
}
And we need a list row view that shows one restaurant at a time:
struct RestaurantRow: View {
var restaurant: Restaurant
var body: some View {
Text(restaurant.name)
}
}
Finally, we need a view that hosts a list of available restaurants:
struct ContentView: View {
var body: some View {
let first = Restaurant(name: "Joe's Original")
let restaurants = [first]
return NavigationView {
List(restaurants) { restaurant in
RestaurantRow(restaurant: restaurant)
}.navigationBarTitle("Select a restaurant")
}
}
}
That code shows one restaurant in a list, but it isn’t selectable.
In order to make tapping a row show a detail view, we first need a detail view that can show a restaurant. For example, something like this:
struct RestaurantView: View {
var restaurant: Restaurant
var body: some View {
Text("Come and eat at \(restaurant.name)")
.font(.largeTitle)
}
}
And with that in place we can now wrap our RestaurantRow
rows in a NavigationLink
, like this:
return NavigationView {
List(restaurants) { restaurant in
NavigationLink(destination: RestaurantView(restaurant: restaurant)) {
RestaurantRow(restaurant: restaurant)
}
}.navigationBarTitle("Select a restaurant")
}
As you can see, that uses RestaurantView(restaurant: restaurant)
as the destination for the row tap event, so that will create the RestaurantView
and pass in the restaurant that was attached to the list row in question.
Notice how we have literally put a list row inside a navigation link – SwiftUI makes it work thanks to its remarkable composition abilities.
SPONSORED Would you describe yourself as knowledgeable, but struggling when you have to come up with your own code? Fernando Olivares has a new book containing iOS rules you can immediately apply to your coding habits to see dramatic improvements, while also teaching applied programming fundamentals seen in refactored code from published apps.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.