binding - 如何翻译视图中的绑定?
问题描述
我创建了一个用于设置时间(分钟和秒)的视图。它使用两个绑定到两个状态变量的选轮器。
现在我想在应用程序的不同位置使用该视图,但我不喜欢当时有两个单独变量的界面。相反,我希望只有一个绑定变量以秒为单位保存时间(因此 time = 185 将转换为 3 分 5 秒)。
绑定之间是否可以有某种“适配器”?
这是视图:
import SwiftUI
struct TimePicker: View {
var minutes: Binding<Int>
var seconds: Binding<Int>
var body: some View {
HStack() {
Spacer()
Picker(selection: minutes, label: EmptyView()) {
ForEach((0...9), id: \.self) { ix in
Text("\(ix)").tag(ix)
}
}.pickerStyle(WheelPickerStyle()).frame(width: 50).clipped()
Text("Min.")
Picker(selection: seconds, label: EmptyView()) {
ForEach((0...59), id: \.self) { ix in
Text("\(ix)").tag(ix)
}
}.pickerStyle(WheelPickerStyle()).frame(width: 50).clipped()
Text("Sec.")
Spacer()
}
}
}
解决方案
这是基于Binding(get:set:)
struct TimePicker: View {
@Binding var total: Int
var minutes: Binding<Int> {
Binding<Int>(get: { self._total.wrappedValue / 60 },
set: { self._total.wrappedValue = self._total.wrappedValue % 60 + $0 * 60 })
}
var seconds: Binding<Int> {
Binding<Int>(get: { self._total.wrappedValue % 60 },
set: { self._total.wrappedValue = (self._total.wrappedValue / 60) * 60 + $0 })
}
var body: some View {
HStack() {
Spacer()
Picker(selection: minutes, label: EmptyView()) {
ForEach((0...9), id: \.self) { ix in
Text("\(ix)").tag(ix)
}
}.pickerStyle(WheelPickerStyle()).frame(width: 50).clipped()
Text("Min.")
Picker(selection: seconds, label: EmptyView()) {
ForEach((0...59), id: \.self) { ix in
Text("\(ix)").tag(ix)
}
}.pickerStyle(WheelPickerStyle()).frame(width: 50).clipped()
Text("Sec.")
Spacer()
}.frame(height: 200)
}
}
struct TestTimePicker: View {
@State var seconds = 185
var body: some View {
VStack {
Text("Current: \(seconds)")
TimePicker(total: $seconds)
}
}
}
struct TestConditionalPicker_Previews: PreviewProvider {
static var previews: some View {
TestTimePicker()
}
}
推荐阅读
- reactjs - 无法覆盖深度嵌套组件的样式(Material-UI Jss 样式)
- java - Batch Status 卡在 STARTING 状态,
- python - 将 JSON 转换为 excel 时出现 Pandas 值错误
- javascript - 一个 javascript 会话可以容纳多少个字符?
- python - 如何创建两个值的序列?
- javascript - 如何用moment js做一个格式
- node.js - 如何在我的情况下使用 node.js 打开二进制文件 .nii 文件
- c# - WPF/c#:如何在使用 SplashScreen / Loading Screen 时解决线程问题
- android - 如果 Google Play 游戏服务提供实时多人游戏,那么使用 gamesparks.com 有什么优势?这两者有什么区别?
- python - 如何使用 pymodbus 为将读取它们的外部 Modbus 客户端写入输入寄存器