【发布时间】:2020-04-03 23:14:53
【问题描述】:
我正在试验来自https://alanquatermain.me/programming/swiftui/2019-11-15-CoreData-and-bindings/ 的代码
我的目标是让 DatePicker 绑定到 Binding 允许 nil 值而不是初始化到 Date();这很有用,如果您的核心数据模型实体中有 Date 属性,它接受 nil 作为有效值。
这是我的快速操场代码:
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)
我找不到修复此代码的解决方案。它在第一次切换到打开时有效,但在切换回关闭时崩溃。
当我删除 DatePicker 时,代码似乎表现正常,并将代码更改为以下代码:
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)
我怀疑这与这部分代码有关
DatePicker("Due Date", selection: Binding($testDate)!, displayedComponents: .date )
或
source.wrappedValue 设置回 nil 时的问题(参考 Binding 扩展)
【问题讨论】:
标签: ios swift core-data swiftui swift-playground