如何在视图中转换绑定?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在视图中转换绑定?相关的知识,希望对你有一定的参考价值。
我创建了一个用于设置时间(分钟和秒)的视图。它使用绑定到两个状态变量的两个车轮选择器。
现在,我想在应用程序的不同位置使用该视图,但是我暂时不喜欢带有两个单独变量的界面。相反,我只希望有一个绑定变量以秒为单位保存时间(因此,时间= 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()
}
}
以上是关于如何在视图中转换绑定?的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin Android Studio - setContenView - 绑定(片段)