如何翻译视图中的绑定?

Posted

技术标签:

【中文标题】如何翻译视图中的绑定?【英文标题】:How to translate bindings in a view? 【发布时间】:2019-12-11 13:28:43 【问题描述】:

我创建了一个用于设置时间(分钟和秒)的视图。它使用两个绑定到两个状态变量的选轮器。

现在我想在应用程序的不同位置使用该视图,但我不喜欢当时有两个单独变量的界面。相反,我希望只有一个绑定变量以秒为单位保存时间(因此 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: @escaping () -&gt; Value, set: @escaping (Value) -&gt; Void) @Asperi 这是一个有趣的提示,但我正在努力在我的示例中实现它。 @G.Marc 这可能有助于理解:gist.github.com/AliSoftware/ecb5dfeaa7884fc0ce96178dfdd326f8 【参考方案1】:

这是基于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()
    

【讨论】:

您有什么理由使用self._total.wrappedValue 而不仅仅是self.total

以上是关于如何翻译视图中的绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如何在视图绑定中的活动中获取回收者视图当前项目文本值

如何从主干中的另一个视图绑定元素上的事件

如何将架构绑定添加到 SQL Server 2008 中的视图

如何将动作绑定到 python 中的 tkinter 树视图的标题?

Xamarin - 点击时如何从列表视图中的 ImageCell 获取数据绑定字符串值?

如何在视图中绑定数据