当前位置:   article > 正文

SwiftUI预览界面Previews 如何修改@Binding变量的问题_swiftui15 #preview binging

swiftui15 #preview binging

我们经常需要在Previews中调试,因为Previews速度快,但使用Previews时,需要注意一些与直接View的区别。

比较对于@Binding 变量在Previews中不能直接给$value传值,需要用Binding.constant(value)传入,但Binding.constant就导致value不能修改

如下:

  1. struct testbindView: View {
  2. @Binding var selectedOption:String
  3. var body: some View {
  4. VStack {
  5. Text("selectedOption: \(selectedOption)")
  6. ChildView(selectedOption: $selectedOption)
  7. }
  8. }
  9. }
  10. struct ChildView: View {
  11. @Binding var selectedOption: String
  12. var body: some View {
  13. Button("Increment") {
  14. selectedOption = "OK"
  15. }
  16. }
  17. }
  18. struct MyDemoView: View{
  19. @State private var Option2 = ""
  20. @Binding var Option2:String
  21. var body: some View {
  22. testbindView($Option1) //点击按键,在界面中Increment后面显示OK
  23. testbindView($Option2) //点击按键,在界面中Increment后面显示还是原来内容test
  24. }
  25. }
  26. struct MyDemoView_Previews: PreviewProvider {
  27. static let myStr = "test"
  28. static var previews: some View {
  29. MyDemoView(Option2: Binding.constant(myStr))
  30. }
  31. }

我开始以为是@Binging和@State有区别,导致Option2没有变化。

为什么使用Binding.constant

在 Previews 中创建视图时,无法直接访问属性包装器 @Binding。这是因为,在预览环境中,属性被视为常量,而不是绑定变量。

当您需要在预览中使用 @Binding 属性时,可以使用 Binding.constant(value) 创建一个常量绑定,它将属性包装在一个不可变的绑定变量中,并将值传递给它。这样,您就可以在预览中使用这个属性了。

例如:

  1. struct MyView_Previews: PreviewProvider {
  2. static var previews: some View {
  3. let myBinding = Binding.constant("Hello, world!")
  4. return MyView(myProperty: myBinding)
  5. }
  6. }

在这种情况下,myBinding 被包装在一个常量绑定中,并传递给 MyView 的 myProperty 属性。现在,您可以在预览中使用 myProperty 属性了。

那有什么方法解决这个问题呢?

方法一、

就是再新建一个TestMyDemoView就解决了

如:

  1. struct testMyPlantDetailView: View {
  2. @State private var testOption2 = "test"
  3. var body: some View {
  4. MyDemoView(Option2: testOption2)
  5. }
  6. }
  7. struct MyDemoView_Previews: PreviewProvider {
  8. static var previews: some View {
  9. testMyPlantDetailView()
  10. }
  11. }

现在点击Button("Increment") 后就都变为“OK"了

方法二

你可以包装在一个可变变量中,以便在预览中对其进行更改。例如,您可以使用 Binding 的 init(get: set:) 初始化程序来创建一个可变的绑定变量,

如下:
 

  1. struct MyDemoView_Previews: PreviewProvider {
  2.     @State static var myValue: String = "Hello, world!"
  3.     static var myBinding: Binding<String> {
  4.         Binding<String>(get: {
  5.             myValue
  6.         }, set: { newValue in
  7.             myValue = newValue
  8.         })
  9.     }
  10.     static var previews: some View {
  11.         MyDemoView(Opetion2: myBinding)
  12.             .onAppear {
  13.                 myValue = "New value"
  14.             }
  15.     }
  16. }

在这种情况下,我们使用 @State 属性包装器来创建可变的 myValue 变量,并使用 Binding.init(get:set:) 初始化程序创建一个可变的绑定变量 myBinding,它使用可变的 myValue 变量来在预览中更改值。在预览中,您可以像上面那样对 myValue 进行更改,并且它将通过绑定变量传递到视图中。

以上是两种方法,如有不对,或你还有其他方法,请告诉我,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/462580
推荐阅读
相关标签
  

闽ICP备14008679号