How to create an extension on a view to show alerts on long press gesture - SwiftUI

Viewed 1071

I am creating an app in SwiftUI on iOS 13 in Xcode 11.6

I want to create an extension on SwiftUI's View that shows an alert message when a user long presses on the view.

For example, suppose I have a view like so:

import SwiftUI

struct TestView: View {
    
    var body: some View {
        TabView {
            Text("1").addLongPressAlert("Test 1")
            Text("2").addLongPressAlert("Test 2")
            Text("3").addLongPressAlert("Test 3")
        }
    }
}

The extension on View would look something like this:

extension View {
   
    public func addLongPressAlert(message _ : String) -> some View {
        return self.onLongPressGesture {
            // I know this is not how you show an alert, but im unsure how to display it
            Alert(title: Text("Alert"), message: Text(m), dismissButton: .default(Text("OK!")))
        }
    }
}

I am struggling to figure out how to set this up correctly.

Does anyone know how to achieve this?

1 Answers

You can create a custom ViewModifier:

struct LongPressAlertModifier: ViewModifier {
    @State var showAlert = false
    let message: String

    func body(content: Content) -> some View {
        content
            .onLongPressGesture {
                self.showAlert = true
            }
            .alert(isPresented: $showAlert) {
                Alert(title: Text("Alert"), message: Text(message), dismissButton: .default(Text("OK!")))
            }
    }
}

and use it like this:

Text("1").modifier(LongPressAlertModifier(message: "Test1"))

You can even create a custom View extension:

extension View {
    func addLongPressAlert(_ message: String) -> some View {
        self.modifier(LongPressAlertModifier(message: message))
    }
}

and use your modifier in a more convenient way:

Text("1").addLongPressAlert("Test 1")
Related