赞
踩
我们经常需要在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
进行更改,并且它将通过绑定变量传递到视图中。
以上是两种方法,如有不对,或你还有其他方法,请告诉我,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。