#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. Я предполагаю, что вы говорите о сообщении для всплывающего окна. Тогда да, добавьте еще одну привязку для сообщения и привяжите ее обратно к родительскому представлению.