ios - 有没有办法使用 SwiftUI 将可选对象绑定(bind)到 Toggle/Slider

标签 ios swift iphone user-interface swiftui

我的数据模型中有一个 UInt?(可选)属性,我正尝试使用 SwiftUI 将其绑定(bind)到 ToggleSlider .我正在尝试做这样的事情:

  • maximumRingsShownCount 的值为 4(不是 nil),那么切换应该打开并且该值绑定(bind)到 slider 。
  • maximumExpandedRingsShownCount 值为 nil,则切换应关闭并且 slider 不会显示。

Toggle and Sliders rendered with SwiftUI

我在这里面临两个问题:

  1. 看起来我们不能有可选的绑定(bind)(对于 slider )
  2. 是否可以使用转换器将可选值转换为 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 布局是正确的,但我仍然遇到上述问题,因为:

  1. haveMaximumRingsShownCount 状态未绑定(bind)到我的 config.maximumRingsShownCount 模型是否为零
  2. 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/

相关文章:

iphone - 是否可以通过SDK获取用户的apple ID?

iphone - iOS 的云存储选项

ios - UIImagePicker 相机内存警告阻止图像被设置为 UIImageView

swift - CGRectGet 不能正常工作

iphone - 在我的iPhone应用程序中集成Facebook发布请求

swift - 如何使用 Swift 在 mapkit 上更改未选择的注释图钉图像

ios - 这是实体的属性吗?

ios - 在swift中,强变量是否需要在使用后设置为nil?

ios - MpMovieplayer加载期间如何显示缓冲符号/符号

ios - 在 StoryBoard 中调整 Collection View 标题的大小