我有一个定制的SwiftUI选取器.挑选者需要两样东西:小时和分钟.我的 struct 有一个名为MaxDurationSecond的值.我的目标是,如果用户 Select 小时和分钟的组合,这使得总的值超过了MaxDurationSecond,我希望将小时和分钟都重置为零.

var body: some View {
    let hours = [Int](0...maxHours)
    let minutes = [Int](0...maxMinutes)
    GeometryReader { geometry in
        HStack(spacing: 0) {
            Picker(selection: self.selection.hours, label: Text("")) {
                ForEach(0..<maxHours, id: \.self) { index in
                    Text("\(hours[index]) hr")
                        .foregroundColor(Color(Asset.Color.V2.white.color))
                }
            }
            .pickerStyle(.wheel)
            .frame(width: geometry.size.width / 2, height: geometry.size.height, alignment: .center)
            Picker(selection: self.selection.minutes, label: Text("")) {
                ForEach(0..<maxMinutes, id: \.self) { index in
                    Text("\(minutes[index]) min")
                        .foregroundColor(Color(Asset.Color.V2.white.color))
                }
            }
            .pickerStyle(.wheel)
            .frame(width: geometry.size.width / 2, height: geometry.size.height, alignment: .center)
        }
    }
}

由于文件很大,因此省略了 struct 的其余部分.但以下是必要的信息: 我们正在从 Select 中获得一个绑定,其中有小时和分钟. 最大小时数和最大分钟数分别为24和60.

这就是我正在努力实现的目标:

    let hoursInSeconds = selection.hours.wrappedValue
    let minutesInSeconds = selection.minutes.wrappedValue
    if(hoursInSeconds + minutesInSeconds > Int(maxDurationSeconds)) {
        selection.hours.wrappedValue = 0
        selection.minutes.wrappedValue = 0
    }

我不确定要将此代码包含在何处.我try 对选取器视图执行On Tap手势操作,但它不会更新它们.任何反馈都是非常感谢的.

推荐答案

selection元就可以了,比如

GeometryReader { geometry in
    HStack(spacing: 0) {
      // ... content 
    }
    .onChange(of: selection) { _ in // << assuming you confirm it to Equatable
   // .onChange(of: [selection.hours, selection.minutes]) { _ in // << alternate
         if(selection.hours + selection.minutes > Int(maxDurationSeconds)) {
           selection.hours = 0
           selection.minutes = 0
        }
    }
}

Ios相关问答推荐

在SWIFT中将圆角+透明背景从导入视频(.mp4)添加到导出视频(.mov)

如果没有等待,SWIFT Async让任务抛出取消异常

在将Cocoapods更新到1.13.0之后,它抛出错误

如何使用自定义数据源在本地react 本机 ios 应用程序中加载 Tradingview 小部件?

Swift Combine和iOS版本限制?

在 iOS 上启用明文本地流量在 .NET MAUI 中不起作用

ITMS-90725 无用的错误信息,因为它自相矛盾,苹果上传

Flutter 构建 ios 失败:运行 pod 安装时出错

我无法使用 Swift 将文件上传到 firebase

VStack 显示错误实例方法 'sheet(item:onDismiss:content:)' 要求 'Int' 符合 'Identifiable'

SwiftUI:通过Sheet将数据添加到Realm DB时视图不更新

Xcode 13.4.1 (13F100)Command CodeSign 失败,退出代码非零我应该删除哪个证书?

SwiftUI - 在ForEach的每个元素之间自动添加分隔符

iOS,Swift 5,AppDelegate open url / .onOpenUrl - 如何找到调用我的自定义方案的调用应用程序

UICollectionView 添加 UICollectionCell

如何以编程方式调用视图控制器?

单击 GoogleSignIn 按钮时应用程序崩溃

UISegmentedControl 以编程方式更改段数

Xcode 5 和 iOS 7:架构和有效架构

值/对象的 NSDictionary 键?