SwiftUI: How to present view when clicking on a button?

后端 未结 3 719
無奈伤痛
無奈伤痛 2020-12-05 01:45

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.

3条回答
  •  醉酒成梦
    2020-12-05 02:17

    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
    
    

提交回复
热议问题