I'm having problem dismissing a modal view when calling it inside a navigation bar with SwiftUI

At tap "Show Modal" button in navigation bar, the modal is shown. But, when "Dismiss" button is tapped, the modal never is showed. If the modal is swiped, the error don't occurr.

import SwiftUI

struct ContentView: View {
    @State var showModal = false

    var body: some View {
        NavigationView {
            Text("Hello, World!")
                .navigationBarItems(trailing: Button("Show Modal") {

                    self.showModal = true
                    })
        }.sheet(isPresented: self.$showModal) {
            Modal()
        }
    }
}

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

    var body: some View {
        NavigationView {
            Text("Modal")
                .navigationBarItems(leading: Button("Dismiss") {
                    self.mode.wrappedValue.dismiss()
                })
        }
    }
}

Upvotes: 0

Views: 192

Answers (1)

Bartosz
Bartosz

Reputation: 388

You need to toggle off the showModal state. Something like this will work. I merged both views to demonstrate quickly

import SwiftUI

struct ContentView: View {
    @State var showModal = false
    @Environment(\.presentationMode) var mode

    var body: some View {
        NavigationView {
            Text("Hello, World!")
                .navigationBarItems(trailing: Button("Show Modal") {

                    self.showModal.toggle()
                    })
        }.sheet(isPresented: self.$showModal) {
            NavigationView {
                Text("Modal")
                    .navigationBarItems(leading: Button("Dismiss") {
                        self.showModal.toggle()
                        self.mode.wrappedValue.dismiss()

                    })
            }
        }
    }
}

Upvotes: 1

Related Questions