SwiftUI, Как отменить текущее представление View при успешном завершении вызова API - PullRequest
0 голосов
/ 14 февраля 2020

Я использую SwiftUI и пытаюсь выполнить простое логическое действие, но не могу понять иерархию действий SwiftUI.

У меня есть один вызов API примерно так:

final class TaskData: ObservableObject {

    @Published var updatedFields = false
    @Published var updateMsg = ""


    func updateFields()
    {
        //Some API Call
        .whenSuccess { (response) in
            DispatchQueue.main.async {
                self.updatedFields = true
                self.updateMsg = "Successfully updated fields"
                //Send Request to dismiss current View ???
            }
        }
    }
}

Сейчас У меня есть вид, похожий на этот, и по запросу я хочу отклонить этот вид, но я не могу найти какой-либо метод для этого,

struct TaskView: View {

@Environment(\.presentationMode) var currentView: Binding<PresentationMode>
@EnvironmentObject var taskData: TaskData

var body : some View {

    //Some Views here ////

    //Need Some code here to dismiss currentView?????

    .navigationBarItems(trailing: Button(action: {

    }, label: {
        Text("Done")
    }).onTapGesture {
        self.taskData.updateFields() // Method Call to Update fields
    })
}

, если кто-то может объяснить эту вещь в некоторых деталях поскольку я новичок ie в SwiftUI, я видел много учебников, но не смог понять эту структуру swift.

1 Ответ

0 голосов
/ 14 февраля 2020

Не показано, как представляется TaskView, но, имея presentationMode в снимке снимка кода, давайте предположим, что он действителен, поэтому подход может быть следующим

@Environment(\.presentationMode) var presentationMode //better to name it same, 
                                                      //type is extracted from Environment
@EnvironmentObject var taskData: TaskData

var body : some View {

    //Some Views here ////
    SomeView()
        .onReceive(taskData.$updatedFields) { success in
           if success {
              self.presentationMode.wrappedValue.dismiss() // dismiss self
           }
        }
    ...
...