微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将步进值传递给另一个视图 - SwiftUI

如何解决将步进值传递给另一个视图 - SwiftUI

我在 SwiftUI 中有一个非常简单的“应用程序”

如何将步进值从列表传递到结构 SumOfValue 或 ContentView ?但我想传递步进值的总和,以防图像中的值为 8。

struct ContentView: View {
    var body: some View {
        vstack{
            List{
                ProductList()
                ProductList()
                
            }
            Spacer()
            Text("Sum of stepper value: ?????")
                .padding(.bottom,50
                )
            
            SumOfValue()
        }
    }
}

struct ProductList:View {
    @State var stepperValueTest: Int = 0
    var body: some View {
        HStack {
            Stepper("Value: \(stepperValueTest)",value: $stepperValueTest)
        }   
    }
}

struct SumOfValue: View {
    var body: some View {
        Text("or here sum of value: ????? ")
            .foregroundColor(Color.red)
    }
}

我尝试使用@Binding 但没有用。

解决方法

这里有多种方法,归根结底是数据组织的问题。

一种思考方式是,有一个值数组,父级 - ContentView 在您的情况下 - “拥有”,每个子级使用绑定更新该数组中分配的值。这样,父级可以轻松计算这些值的总和,因为它拥有整个数组。

struct ContentView: View {
   @State var values = [0,0]

   var body: some View {
      VStack {
         List {
            ProductList(stepperValueTest: $values[0])
            ProductList(stepperValueTest: $values[1])
            ProductList(stepperValueTest: $values[2])
         }
         Text("Sum: \(sum)")
      }
   }

   var sum: Int { values.reduce(0,+) }
}
struct ProductList:View {
    @Binding var stepperValueTest: Int // change to Binding
    var body: some View {
        HStack {
            Stepper("Value: \(stepperValueTest)",value: $stepperValueTest)
        }   
    }
}
,

@State 进入父级 (ContentView),而 @Binding 进入子级(ProductList 和 SumOfValue)。

试试这个:

struct ContentView: View {

    /// States here!
    @State var firstStepperValue: Int = 0
    @State var secondStepperValue: Int = 0

    var body: some View {
        VStack{
            List{

                /// pass it in here!
                ProductList(stepperValueTest: $firstStepperValue)
                ProductList(stepperValueTest: $secondStepperValue)
                
            }
            Spacer()

            /// add the values here
            Text("Sum of stepper value: \(firstStepperValue + secondStepperValue)")
                .padding(.bottom,50
                )
            
            /// you can also pass it in here
            SumOfValue(first: $firstStepperValue,second: $secondStepperValue)
                .padding(.bottom,100)
        }
    }
}

struct ProductList:View {

    /// Binding here!
    @Binding var stepperValueTest: Int
    var body: some View {
        HStack {
            Stepper("Value: \(stepperValueTest)",value: $stepperValueTest)
        }
    }
}

struct SumOfValue: View {
    @Binding var first: Int
    @Binding var second: Int
    
    var body: some View {
        Text("or here sum of value: \(first + second) ")
            .foregroundColor(Color.red)
    }
}

结果:

sum is displaying

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。