Swiftui 使用日期选择器日期作为另一个视图的输入

Swiftui 使用日期选择器日期作为另一个视图的输入,swiftui,Swiftui,目标:使用datepicker的选定日期组件作为从外部网站获取报价的视图的输入 尝试了以下方法:使用qDate:Date作为QuotesViewModel和QuotesView的init()参数-但这种方法似乎只有在参数为struct/class时才有效。 还尝试使用@Binding变量,但没有成功 有优雅的解决方案吗 struct HomeView: View { @State var qDate = Date() var body: some View {

目标:使用datepicker的选定日期组件作为从外部网站获取报价的视图的输入

尝试了以下方法:使用qDate:Date作为QuotesViewModel和QuotesView的init()参数-但这种方法似乎只有在参数为struct/class时才有效。 还尝试使用@Binding变量,但没有成功

有优雅的解决方案吗

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。