Представить предупреждение на предыдущем экране SwiftUI

#ios #swift #swiftui

Вопрос:

У меня есть представление, которое дает пользователям возможность перейти на страницу внешней поддержки или на экран обратной связи в приложении.

 struct HelpView: View {
    var body: some View {
        ZStack {
            Color("Tope")
                .ignoresSafeArea()
            
            List {
                NavigationLink(destination: FeedbackView()) {
                    Text("Report a problem")
                        .fontWeight(.semibold)
                }
                HStack {
                    Link(destination: URL(string: "https://sauced.app")!) {
                        Text("Help Center")
                            .fontWeight(.semibold)
                    }
                    Spacer()
                    Image(systemName: "chevron.right")
                        .foregroundColor(Color.black)
                }
            }
        }
        .listStyle(InsetGroupedListStyle())
        .navigationBarTitle("Help")
    }
}
 

Экран обратной связи-это всего лишь простая форма, которая дает пользователям возможность заполнить текстовое поле и отправить его в серверную часть. Как только пользователь успешно заполнит это поле, я представлю ему всплывающее окно с благодарностью за отзывы. Вместо этого я хотел бы вернуть их на экран и вместо этого представить предупреждение этого экрана, экран справки. Как я могу этого достичь? Я думал об использовании завершения, но не был уверен, как это сделать в данном случае.

Вот форма, которую я в настоящее время имею в FeedbackView

 Button(action: {
    fvm.submitFeedback(parameters: ["description": feedback, "user_id": 
        session.userObject.id!]) {
            response, error in
                if error != nil {
                    print("error: (response)")
                } else {
                // dismiss current screen
                presentationMode.wrappedValue.dismiss()
                // also present an an alert view on the previous screen somehow
            }
        }
    }, label: {
        Text("Send")
            .fontWeight(.semibold)
    })
.disabled(fieldHasText())
 

Ответ №1:

вы могли бы попробовать этот подход, используя простую привязку:

 import SwiftUI
import PopupView

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView() 
        }
    }
}
struct ContentView : View {
    var body: some View {
        NavigationView {
            HelpView()
        }
    }
}
struct HelpView: View {
    @State var showPopup = false  // <-- here
    
    var body: some View {
        ZStack {
            Color.pink.ignoresSafeArea()
            List {
                NavigationLink(destination: FeedbackView(showPopup: $showPopup)) {  // <-- here
                    Text("Report a problem").fontWeight(.semibold)
                }
                HStack {
                    Link(destination: URL(string: "https://sauced.app")!) {
                        Text("Help Center").fontWeight(.semibold)
                    }
                    Spacer()
                    Image(systemName: "chevron.right").foregroundColor(Color.black)
                }
            }
        }
    .popup(isPresented: $showPopup, autohideIn: 3) {
        Text("THANK YOU")
            .frame(width: 200, height: 60)
            .background(Color(red: 0.85, green: 0.8, blue: 0.95))
            .cornerRadius(30.0)
    }
        .listStyle(InsetGroupedListStyle())
        .navigationBarTitle("Help")
    }
}
struct FeedbackView : View {
    @Environment(.dismiss) var dismiss
    @Binding var showPopup: Bool  // <-- here
    
    var body: some View {
        Button(action: {
            showPopup = true  // <-- here
            dismiss()
            }, label: {
                Text("Send").fontWeight(.semibold)
            })
    }
}
 

Комментарии:

1. Обожаю такой подход! Как лучше всего сделать это с помощью динамических сообщений? Просто добавьте связующее сообщение и свяжите его с родительским представлением?

2. Я предполагаю, что вы говорите о сообщении для всплывающего окна. Тогда да, добавьте еще одну привязку для сообщения и привяжите ее обратно к родительскому представлению.