#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!
)