SwiftUI как передать данные на предыдущий экран при увольнении

#ios #swift #swiftui #swiftui-form

Вопрос:

Я хочу передать данные об отклонении presentViewController на предыдущий экран. Здесь я хотел бы использовать блок для передачи данных на предыдущий экран в качестве UIKitApp. Но у меня нет идеи передавать данные. Для чего options мы должны передавать данные обратно?

 struct ContentView: View {
    @State var showModel = false
    var body: some View {
        VStack {
            Button(action: {
                showModel.toggle()
            }, label: {
                Text("Show filters")
            }).sheet(isPresented: $showModel, content: {
                FilterView()
            })
        }
    }
}

struct FilterView: View {
    @Environment(.presentationMode) var presentationMode

    var onDismiss: ((_ model: Filter) -> Void)?

    var body: some View {
        
        VStack {
            Button(action: {
                // Pass data from here to ContentView
                let filter = Filter(fromDate: "10/07/2021", toDate: "12/07/2021")
                onDismiss?(filter)
                presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("Applay Filters")
            }).padding()
        }.padding()
    }
}

struct Filter {
    var fromDate: String
    var toDate: String
}
 

Ответ №1:

Вы можете использовать @Binding для этого (или @StateObject @ObservedObject , @Environmentobject с @ObservableObject использованием шаблона проектирования MVVM)

Приведенный ниже код является примером использования @Binding.

Добавленные/Отредактированные Строки

 Text("(filter.fromDate) and (filter.toDate)") // to see the changed values

@State var filter = Filter(fromDate: "", toDate: "") // in ContentView

@Binding var filter: Filter // in FilterView

FilterView(filter: $filter) // $ used for @Binding parameter
 

Полный Код

 struct ContentView: View {
    @State var showModel = false
    @State var filter = Filter(fromDate: "", toDate: "")
    
    var body: some View {
        VStack {
            Text("(filter.fromDate) and (filter.toDate)")
            Button(action: {
                showModel.toggle()
            }, label: {
                Text("Show filters")
            }).sheet(isPresented: $showModel, content: {
                FilterView(filter: $filter)
            })
        }
    }
}

struct FilterView: View {
    @Environment(.presentationMode) var presentationMode

    var onDismiss: ((_ model: Filter) -> Void)?
    @Binding var filter: Filter

    var body: some View {
        
        VStack {
            Button(action: {
                // Pass data from here to ContentView
                filter = Filter(fromDate: "10/07/2021", toDate: "12/07/2021")
                onDismiss?(filter)
                presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("Applay Filters")
            }).padding()
        }.padding()
    }
}

struct Filter {
    var fromDate: String
    var toDate: String
}
 

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

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

1. спасибо @Taeeun onDismiss, мы можем указать дату«swift .sheet(представлен: $showModel, onDismiss: { печать(«(filter.FromDate) и (фильтр. ToDate)») }, содержимое: { FilterView(фильтр: $фильтр) })»‘

2. Есть еще какие-нибудь способы? Мы должны создать объект, верно? @State var filter: Filter(fromDate: "", toDate: "")

3. @iOSDeveloper добро пожаловать! Могу я еще раз спросить вас, что вы имеете в виду? Если вы хотите создать объект без начальных значений , как @State var filter: Filter() , то вы можете использовать Необязательный(использовать ? в конце типа), как var fromDate: String? и var toDate: String? . Затем вы можете использовать @State var filter: Filter() , И вам нужно изменить это filter.fromDate на filter.fromDate ?? "no date" , потому что теперь это необязательное значение. (или filter.fromDate! )