Swiftui 使用日期选择器日期作为另一个视图的输入
目标:使用datepicker的选定日期组件作为从外部网站获取报价的视图的输入 尝试了以下方法:使用qDate:Date作为QuotesViewModel和QuotesView的init()参数-但这种方法似乎只有在参数为struct/class时才有效。 还尝试使用@Binding变量,但没有成功 有优雅的解决方案吗Swiftui 使用日期选择器日期作为另一个视图的输入,swiftui,Swiftui,目标:使用datepicker的选定日期组件作为从外部网站获取报价的视图的输入 尝试了以下方法:使用qDate:Date作为QuotesViewModel和QuotesView的init()参数-但这种方法似乎只有在参数为struct/class时才有效。 还尝试使用@Binding变量,但没有成功 有优雅的解决方案吗 struct HomeView: View { @State var qDate = Date() var body: some View {
struct HomeView: View {
@State var qDate = Date()
var body: some View {
DatePicker("", selection: $qDate, displayedComponents: .date)
QuotesView()
}
}
struct QuotesView : View {
@ObservedObject var vm: QuotesViewModel
init() {
self.vm = QuotesViewModel()
}
var body: some View {
Text(vm.quote ?? "")
}
}
class QuotesViewModel: ObservableObject {
@Published var quote: String?
// Use Datepicker qDate components to create URL to fetch quote from external website.
}
如果使用init将值传递到视图中,则对该值的任何外部更改都将导致重新生成视图:
struct HomeView: View {
@State var qDate = Date()
var body: some View {
DatePicker("", selection: $qDate, displayedComponents: .date)
QuotesView(quoteDate: qDate)
}
}
struct QuotesView: View {
let viewModel: QuotesViewModel
init(quoteDate: Date) {
self.viewModel = QuotesViewModel(quoteDate: quoteDate)
}
var body: some View {
Text(viewModel.quote)
}
}
class QuotesViewModel: ObservableObject {
@Published var quote: String
init(quoteDate: Date) {
//... Your external service
let quotes = ["Be yourself; everyone else is already taken.", "Try to be a rainbow in someone else's cloud."]
self.quote = quotes.randomElement() ?? ""
}
}
绑定应该可以工作,您是否可以发送尝试绑定时的代码您可以通过将其更改为:
QuotesView(viewModel:QuotesViewModel(quoteDate:qDate))
来减少一些代码,这样可以保存init。