如何以编程方式更改 swiftUI DatePicker 的选定值

Posted

技术标签:

【中文标题】如何以编程方式更改 swiftUI DatePicker 的选定值【英文标题】:How to change selected value of swiftUI DatePicker programmatically 【发布时间】:2022-01-23 20:17:32 【问题描述】:

我有一个由三个 swiftUI 选择器(两个 DatePickers 和一个标准字符串选择器)组成的 swiftUI 表单。当字符串 Picker 的值发生变化时,我正在尝试更改第二个 DatePicker 的选定值。

我在字符串 Picker 上使用 .onChange 来更新基础值,这工作正常(我添加了一个文本行来显示到期日期值,以便可以验证更改)。但是,我希望到期日选择器在绑定值更改时更新它显示的日期。

*下面屏幕截图中的值是最初设置的值。

struct FormWithPicker: View 
    @StateObject var formValues = FormValues()
    
    var body: some View 
        NavigationView 
            Form
                // invoice date
                DatePicker("Invoice Date:", selection: $formValues.invoiceDate, displayedComponents: [.date])
                
                // terms
                Picker("Terms:", selection: $formValues.invoiceTerms) 
                    ForEach(formValues.terms, id: \.self)  term in
                        Text(term)
                    
                
                .onChange(of: formValues.invoiceTerms, perform:  _ in
                    formValues.incrementDueDate()
                )
                
                // due date
                DatePicker("Due Date:", selection: $formValues.dueDate, displayedComponents: [.date])
                    
                // text
                Text(formValues.dueDate.description)
                
            
        
    

【问题讨论】:

如果没有Minimal Reproducible Example,就无法帮助您进行故障排除。它们有什么关系? 【参考方案1】:

我们需要将DatePicker 依赖于外部更改的dueDate 并重建它。 .id 修饰符对此很有用,比如

DatePicker("Due Date:", selection: $formValues.dueDate, displayedComponents: [.date])
    .id(formValues.dueDate)    // << here !!

使用 Xcode 13.2 / ios 15.2 测试

【讨论】:

经过测试并且运行良好(Xcode 13.1、iOS 15.0)。正是我正在寻找的行为。谢谢。

以上是关于如何以编程方式更改 swiftUI DatePicker 的选定值的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:创建自己的 TextField 并以编程方式更改内容

如何以编程方式在 SwiftUI 中滚动?

如何在 SwiftUI 中以编程方式滚动列表?

如何在 SwiftUI 中以编程方式计算 MKMapCamera centerCoordinateDistance

如何以编程方式从 SwiftUI 列表中删除行并刷新列表视图?

如何以编程方式创建等效的 SwiftUI 堆栈视图分隔符