I\'m trying to make an app using Apple\'s SwiftUI and I need to have two buttons that present two different views in a single List row.
improved version. (Swift, iOS 13 beta 4)
class NavigationModel : BindableObject {
var willChange = PassthroughSubject()
var presentedData: String? {
didSet {
willChange.send()
}
}
func dismiss() { if presentedData != nil {
presentedData = nil
} }
}
struct ContentView: View {
var body: some View {
NavigationView {
MasterView()
}.environmentObject(NavigationModel())
}
}
struct MasterView: View {
@EnvironmentObject
var navigationModel: NavigationModel
var destinationLink = DynamicNavigationDestinationLink(id: \.self) { data in DetailView(data: data) }
var body: some View {
List(0..<10) { index in
Button("I am root. Tap for more details of #\(index).") {
self.navigationModel.presentedData = "#\(index)"
}
}
.navigationBarTitle("Master")
.onReceive(navigationModel.willChange) {
self.destinationLink.presentedData?.value = self.navigationModel.presentedData
}
}
}
struct DetailView: View {
@EnvironmentObject
var model: NavigationModel
let data: String
var body: some View {
Button("Here are details of \(data). Tap to go back.") {
self.model.dismiss()
}
.navigationBarTitle("Detail \(data)")
}
}
struct Empty : Hashable {
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif