您现在的位置是:首页 >技术教程 >SwiftUI预览界面Previews 如何修改@Binding变量的问题网站首页技术教程

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

小老板老工程师 2024-06-24 12:01:01
简介SwiftUI预览界面Previews 如何修改@Binding变量的问题

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

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

如下:

struct testbindView: View {
    @Binding var selectedOption:String
    
    var body: some View {
        VStack {
            Text("selectedOption: (selectedOption)")
            ChildView(selectedOption: $selectedOption)
        }
    }
}

struct ChildView: View {
    @Binding var selectedOption: String
    
    var body: some View {
        Button("Increment") {
            selectedOption = "OK"
        }
    }
}


struct MyDemoView: View{
    
    @State private var Option2 = ""

    @Binding var Option2:String


    var body: some View {
        testbindView($Option1) //点击按键,在界面中Increment后面显示OK
        testbindView($Option2) //点击按键,在界面中Increment后面显示还是原来内容test
    }
}

struct MyDemoView_Previews: PreviewProvider {
    static let myStr = "test"
    static var previews: some View {
        MyDemoView(Option2: Binding.constant(myStr))
    }
}

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

为什么使用Binding.constant

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

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

例如:

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

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

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

方法一、

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

如:

struct testMyPlantDetailView: View {
    
    
     @State private var testOption2 = "test"
    
    var body: some View {
        MyDemoView(Option2: testOption2)
    }
}

struct MyDemoView_Previews: PreviewProvider {
     
    static var previews: some View {
        testMyPlantDetailView()
    }
}

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

方法二

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

如下:
 

struct MyDemoView_Previews: PreviewProvider {
    @State static var myValue: String = "Hello, world!"
    static var myBinding: Binding<String> {
        Binding<String>(get: {
            myValue
        }, set: { newValue in
            myValue = newValue
        })
    }

    static var previews: some View {
        MyDemoView(Opetion2: myBinding)
            .onAppear {
                myValue = "New value"
            }
    }
}

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

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。