diniska / modal-view

Present Modal view with Swift UI in the same way you would do with NavigationView
MIT License
92 stars 9 forks source link

ModalView

Swift 5.1 Xcode 11 iOS 13.0 iPadOS 13.0 MacOS 10.15 Tests

An analogue of SwiftUI NavigationView that provides a convenient interface of displaying modal views.

How to use

Step 1

Add a dependency using Swift Package Manager to your project: https://github.com/diniska/modal-view

Step 2

Import the dependency

import ModalView

Step 3

Use ModalPresenter and ModalLink the same way you would use NavigationView and NavigationLink:

struct ContentView: View {
    var body: some View {
        ModalPresenter {
            ModalLink(destination: Text("Modal View")) {
                Text("Main view")
            }
        }
    }
}

Result

Presenting modal view with SwiftUI

Additional information

To add a "close" button to a modal view we can use a dismiss closure provided by the ModalLink:

struct ContentView: View {
    var body: some View {
        ModalPresenter {
            ModalLink(destination: { dismiss in
                Button(action: dismiss) {
                    Text("Dismiss")
                }
            }) {
                Text("Main view")
            }
        }
    }
}

Moving the destination in the code above to a separate structure is a recommended way here to refactor the code here as modal views regularly contains a bit more that just a text or button.

struct ContentView: View {
    var body: some View {
        ModalPresenter {
            ModalLink(destination: MyModalView.init(dismiss:)) {
                Text("Main view")
            }
        }
    }
}

struct MyModalView: View {
    var dismiss: () -> ()
    var body: some View {
        Button(action: dismiss) {
            Text("Dismiss")
        }
    }
}

Learn more here: Display Modal View with SwiftUI