您现在的位置是:首页 >技术教程 >SwiftUI预览界面Previews 如何修改@Binding变量的问题网站首页技术教程
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
进行更改,并且它将通过绑定变量传递到视图中。
以上是两种方法,如有不对,或你还有其他方法,请告诉我,谢谢!