简体   繁体   English

从swiftUI中的另一个视图关闭模态视图

[英]Dismiss modal view from another view in swiftUI

I want to dismiss a modal view in SwiftUI, but I just can't我想在 SwiftUI 中关闭模态视图,但我不能

This is my code:这是我的代码:

ContentView:内容视图:

import SwiftUI

enum Destination {
    case modal
}

struct ContentView: View {
    @Environment(\.presentationMode) var presentationMode

    @State private var showModal = false

    var body: some View {
        NavigationView {
            ScrollView(.vertical, showsIndicators: false) {
                VStack{
                    SubscribeButtonView(buttonTitle: "Modal", destination: .modal, showModal: $showModal)
                            .padding(.top, 50)
                            .padding(.leading, 30)
                            .padding(.trailing, 30)
                    Spacer()
                }
            }
            .navigationBarTitle(Text("Menu"))
        }
    }
}

The ModalView:模态视图:

import SwiftUI

struct ModalView: View {
    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        NavigationView {
            ScrollView(.vertical, showsIndicators: false) {
                    VStack(alignment: .leading) {
                     Spacer()
                        SaveButtonView(origin: .modal)
                        Spacer()
                    }
                    .padding(.leading, 20)
                    .padding(.trailing, 20)
            }
            .navigationBarTitle("Modal")
            .navigationBarItems(trailing: Button(action: {
                self.presentationMode.wrappedValue.dismiss()
            }) {
                Text("Cancel")
            })
        }
    }
}

The SubscribeButtonView:订阅按钮视图:

import SwiftUI

struct SubscribeButtonView: View {
    @Environment(\.presentationMode) var presentationMode

    var buttonTitle: String
    var destination: Destination

    @Binding var showModal: Bool

    var body: some View {
        Button(action: {
            self.showModal.toggle()
        }) {
            HStack {
                Image(systemName: "plus.circle")
                    .font(.body)
                Text(buttonTitle)
            }
        }.sheet(isPresented: $showModal) {
            if self.destination == .modal {
                ModalView()
            }
        }
        .padding()
    }
}

The SaveButtonView:保存按钮视图:

import SwiftUI

struct SaveButtonView: View {
    @Environment(\.presentationMode) var presentationMode
    var origin: Destination

    var body: some View {
        Button(action: {
            //THIS IS NOT WORKING
            self.presentationMode.wrappedValue.dismiss()
        }) {
            HStack {
                Text("Save")
            }
        }
        .padding()
    }
}

I tried to create a really simple new project with just one state to call the modal, the menu, the modal and the two buttons and it worked just fine.我试图创建一个非常简单的新项目,只有一个状态来调用模态、菜单、模态和两个按钮,它工作得很好。 I can't understand why it isn't working in the code above我不明白为什么它在上面的代码中不起作用

Did anyone have this same issue?有没有人有同样的问题?

You are supposed to bind the presentationMode from ModalView .您应该从ModalView绑定presentationMode。

         struct SaveButtonView: View {
             //@Environment(\.presentationMode) var presentationMode
            @Binding var presentationMode : PresentationMode
            var origin: Destination

            var body: some View {
                Button(action: {
                    //THIS IS NOT WORKING
                    self.$presentationMode.wrappedValue.dismiss()
                }) {
                    HStack {
                        Text("Save")
                    }
                }
                .padding()
            }
        }


     struct ModalView: View {
            @Environment(\.presentationMode) var presentationMode

            var body: some View {

                NavigationView {
                    ScrollView(.vertical, showsIndicators: false) {
                            VStack(alignment: .leading) {
                             Spacer()
                                SaveButtonView( presentationMode: self.presentationMode, origin: .modal)
                                Spacer()
                            }
                            .padding(.leading, 20)
                            .padding(.trailing, 20)
                    }
                    .navigationBarTitle("Modal")
                    .navigationBarItems(trailing: Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                    }) {
                        Text("Cancel")
                    })
                }
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM