SwiftUI DatePicker 绑定可选日期,有效 nil [英] SwiftUI DatePicker Binding optional Date, valid nil

查看:15
本文介绍了SwiftUI DatePicker 绑定可选日期,有效 nil的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在试验来自 https://alanquatermain 的代码.me/programming/swiftui/2019-11-15-CoreData-and-bindings/

我的目标是让 DatePicker 绑定到 Binding<日期?> 允许零值而不是初始化到 Date();这很有用,如果您的核心数据模型实体中有 Date 属性接受 nil 作为有效值.

my goal is to have DatePicker bind to Binding< Date? > which allow for nil value instead of initiate to Date(); this is useful, if you have Date attribute in your core data model entity which accept nil as valid value.

这是我的快速游乐场代码:

Here is my swift playground code:

extension Binding {
    init<T>(isNotNil source: Binding<T?>, defaultValue: T) where Value == Bool {
        self.init(get: { source.wrappedValue != nil },
                  set: { source.wrappedValue = $0 ? defaultValue : nil})
    }
}

struct LiveView: View {
    @State private var testDate: Date? = nil
    var body: some View {
        VStack {
            Text("abc")

            Toggle("Has Due Date",
                   isOn: Binding(isNotNil: $testDate, defaultValue: Date()))

            if testDate != nil {
                DatePicker(
                    "Due Date",
                    selection: Binding($testDate)!,
                    displayedComponents: .date
                )
            }
        }
    }
}

let liveView = LiveView()
PlaygroundPage.current.liveView = UIHostingController(rootView: liveView)

我找不到修复此代码的解决方案.它在切换开关第一次打开时起作用,但在切换开关关闭时崩溃.

I can't find solution to fix this code. It works when the toggle first toggled to on, but crash when the toggle turned back off.

当我删除 DatePicker 并将代码更改为以下内容时,代码似乎运行正常:

The code seems to behave properly when I removed the DatePicker, and change the code to following:

extension Binding {
    init<T>(isNotNil source: Binding<T?>, defaultValue: T) where Value == Bool {
        self.init(get: { source.wrappedValue != nil },
                  set: { source.wrappedValue = $0 ? defaultValue : nil})
    }
}

struct LiveView: View {
    @State private var testDate: Date? = nil
    var body: some View {
        VStack {
            Text("abc")

            Toggle("Has Due Date",
                   isOn: Binding(isNotNil: $testDate, defaultValue: Date()))

            if testDate != nil {
                Text("(testDate!)")
            }
        }
    }
}

let liveView = LiveView()
PlaygroundPage.current.liveView = UIHostingController(rootView: liveView)

我怀疑这部分代码与此有关

I suspect it's something to do with this part of the code

DatePicker("Due Date", selection: Binding($testDate)!, displayedComponents: .date )

source.wrappedValue 设置回 nil 时的问题(参考绑定扩展)

problem when the source.wrappedValue set back to nil (refer to Binding extension)

推荐答案

问题在于 DatePicker 抓取绑定并且即使将其从视图中移除也无法快速释放它,原因是 DatePickercode>Toggle 动作,所以它在强制解包可选时崩溃,它变为 nil ...

The problem is that DatePicker grabs binding and is not so fast to release it even when you remove it from view, due to Toggle action, so it crashes on force unwrap optional, which becomes nil ...

这次崩溃的解决方案是

DatePicker(
    "Due Date",
    selection: Binding<Date>(get: {self.testDate ?? Date()}, set: {self.testDate = $0}),
    displayedComponents: .date
)

这篇关于SwiftUI DatePicker 绑定可选日期,有效 nil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆