【问题标题】:How can I format an Int in "hh:mm" in SwiftUI?如何在 SwiftUI 的“hh:mm”中格式化 Int?
【发布时间】:2020-12-15 15:22:45
【问题描述】:

我有一个非常简单的想法,虽然在 SwiftUI 中这似乎几乎是不可能的。

我希望用户能够在 SwiftUI 文本字段中输入数字并将这些输入的数字显示为“hh:mm”。因此,例如用户输入 3230,应用程序应显示为 32:30,这将是面包食谱中某个步骤的运行时间。

不知何故,我无法弄清楚如何使用户体验流畅。我希望用户立即看到结果。我需要用户能够输入数字并立即希望根据输入的数字更新 UI。我目前只用了几分钟就实现了它,它工作正常。有几个小时和分钟,我似乎无法让它工作。

有人有想法吗?也许自定义 NSNumberFormatter 是一种选择?

我面临的障碍是:

  • 输入数字时格式化
  • 进入时更新 UI
  • 保持用户体验直观和简单

我目前使用的代码是:

TextEditor(text: Binding(get: {
                        if step.stepDuration == 0 { return "" }
                        else { return String(step.stepDuration) }
                    }, set: { (newValue) in
                        guard let recipe = step.parent else { return }
                        recipe.objectWillChange.send()
                        step.stepDuration = Int64(newValue) ?? 0
                    }))
                    .frame(maxWidth: 60)
                    .multilineTextAlignment(.trailing)
                    .keyboardType(.numberPad)

我得到的结果是这样的:

这就是我想要的结果(输入时具有流畅的用户体验)。

我希望有人可以帮助我解决这个问题,我在这里失去了理智。 :O

【问题讨论】:

  • 为什么不使用DatePickerdisplayedComponents: .hourAndMinute?您尝试实现的 UI 只会使事情变得过于复杂。已经有一个用于输入时间的内置 UI 组件,因此通过重用它,您可以获得与 iOS 系统本身一致的 UX 体验。
  • 日期时间选择器的问题在于它被限制为 24 小时。因此,无法输入像示例这样需要 32 小时的步骤。还是我错过了什么?

标签: swift swiftui numberformatter


【解决方案1】:

一个可能的解决方案是DateComponentsFormatter

let value = 3230 
let components = DateComponents(hour:value / 100, minute:value % 100)
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
let string = formatter.string(from: components)

【讨论】:

  • 不幸的是,这并没有让我得到我想要的确切位置,因为我不能正确地将它用作 SwiftUI TextField 的格式化程序。除此之外,它正在做正确的事情。
  • 这是一种将用户输入转换为所需小时:分钟格式的方法,但是如何在用户输入数字时将输入转换为 hh:mm 格式“实时”?这将涉及实现文本字段委托方法,例如textField(_:shouldChangeCharactersIn:replacementString:)
  • 问题是 SwiftUI 没有委托。但我也可能会找到解决方案。我认为这可能是最好的解决方案之一。感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2020-11-11
  • 2011-07-16
  • 2014-10-31
  • 2015-11-30
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多