我的数据模型中有一个 UInt?
(可选)属性,我正尝试使用 SwiftUI 将其绑定(bind)到 Toggle
和 Slider
.我正在尝试做这样的事情:
maximumRingsShownCount
的值为 4(不是 nil),那么切换应该打开并且该值绑定(bind)到 slider 。maximumExpandedRingsShownCount
值为 nil,则切换应关闭并且 slider 不会显示。
我在这里面临两个问题:
- 看起来我们不能有可选的绑定(bind)(对于 slider )
- 是否可以使用转换器将可选值转换为 bool 值(对于 Toggle)?
到目前为止,在我看来,除了我的模型之外,我还声明了 2 个属性:
@ObjectBinding var configuration: SunburstConfiguration
@State private var haveMaximumRingsShownCount: Bool = false
@State private var haveMaximumExpandedRingsShownCount: Bool = false
我的 View 正文包含(对于每个属性):
Toggle(isOn: $haveMaximumRingsShownCount) {
Text("maximumRingsShownCount")
}
if haveMaximumRingsShownCount {
VStack(alignment: .leading) {
Text("maximumRingsShownCount = \(config.maximumRingsShownCount!)")
Slider(value: .constant(4 /* no binding here :( */ ))
}
}
}
UI 布局是正确的,但我仍然遇到上述问题,因为:
haveMaximumRingsShownCount
状态未绑定(bind)到我的config.maximumRingsShownCount
模型是否为零- slider 当前仅显示常量,未绑定(bind)到展开的
config.maximumRingsShownCount
属性
关于如何使用可选值解决这些问题有什么想法吗?
[ 这可以在示例代码中重现 https://github.com/lludo/SwiftSunburstDiagram ]
最佳答案
我发现重载 nil 合并运算符 (??) 来处理这种情况很方便。
// OptionalBinding.swift
import Foundation
import SwiftUI
func OptionalBinding<T>(_ binding: Binding<T?>, _ defaultValue: T) -> Binding<T> {
return Binding<T>(get: {
return binding.wrappedValue ?? defaultValue
}, set: {
binding.wrappedValue = $0
})
}
func ??<T> (left: Binding<T?>, right: T) -> Binding<T> {
return OptionalBinding(left, right)
}
然后您可以按如下方式使用它:
struct OptionalSlider: View {
@Binding var optionalDouble: Double?
var body: some View {
Slider(value: $optionalDouble ?? 0.0, in: 0.0...1.0)
}
}
关于ios - 有没有办法使用 SwiftUI 将可选对象绑定(bind)到 Toggle/Slider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56697721/