0

I'm trying to write a simple application using SwiftUI to understand better how it's working.

In my application logic I need to display a alert with localized description of fault in case if one happened. Quite simple thing. I wrote the following code:

struct LoginView: View {
    @State fileprivate var isDisplayAlertFirebaseError = false
    @State fileprivate var firebaseErrorLocalizedMessage = ""

    // ...

Text("We will send you SMS with validation code to confirm your phone number")
                        .font(.system(size: Appearance.labelFontSize))
                        .multilineTextAlignment(.center)
                        .padding(.horizontal, 55)
                        .offset(x: 0, y: 15)
                        .alert(isPresented: $isDisplayAlertFirebaseError) {
                            Alert(title: Text("Error"), message: Text($firebaseErrorLocalizedMessage), dismissButton: .default(Text("OK")))
                        }
}

However it doesn't compile with message "Initializer 'init(_:)' requires that 'Binding' conform to 'StringProtocol'"

Can you please suggest how can I do that?

Also I'm trying to understand the architecture of SwiftUI, and I found a bit strange, that I need to declare all alerts and assign them to some UI controls (could be a lot alerts in fact in some screens - will be necessary to create empty views for this), is there are really no way to display it just from code? What is the reason of that?

Thank you very much

1
  • Remove the $ in front of firebaseErrorLocalizedMessage. The dollar sign is only for a two-way binding if the variable is going to be modified in the alert view. Commented Jun 24, 2021 at 8:55

1 Answer 1

1

You should use public func alert<Item>(item: Binding<Item?>, content: (Item) -> Alert) -> some View where Item : Identifiable so no need to manage extra flag for presenting alert.

Suppose your firebase error enum type something like this

enum FIRAuthErrorCode: Error, Identifiable {
    var id: FIRAuthErrorCode {
        self
    }
    
    case notValid
}

then you can use it with your view by following way.

struct LoginView: View {
    
    @State fileprivate var firebaseError: FIRAuthErrorCode? = nil
    
    var body: some View {
        VStack {
            Text("We will send you SMS with validation code to confirm your phone number")
                .multilineTextAlignment(.center)
                .padding(.horizontal, 55)
                .offset(x: 0, y: 15)
                .alert(item: $firebaseError) { item in
                    Alert(title: Text("Error"), message: Text(item.localizedDescription), dismissButton: .default(Text("OK")))
                }
            
            Button("Force Show Error") {
                firebaseError = .notValid
            }
        }
    }
}

Now, whenever your firebaseError var change with a new error, an alert will be shown automatically.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.