mal*_*low 12 xcode swift swiftui
我有一个带有变量的 ChildView:
@Binding var itemName: String
Run Code Online (Sandbox Code Playgroud)
在这个 ChildView 中,我有几个按钮可以改变变量的值:
Button(action: {
self.itemName = "different value"
})
Run Code Online (Sandbox Code Playgroud)
我试图像这样使用预览:
struct ChildView_Previews: PreviewProvider {
static var previews: some View {
ChildView(itemName: "test")
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
无法将“字符串”类型的值转换为预期的参数类型“绑定”
我知道我可以像下面这样使用预览。并且错误将消失并且预览将起作用,但是... itemName 将具有恒定值,它现在不可变,在实时预览中不可交互:
struct ChildView_Previews: PreviewProvider {
static var previews: some View {
ChildView(itemName: .constant("test"))
}
}
Run Code Online (Sandbox Code Playgroud)
如何在 SwiftUI Preview 中声明绑定以使其具有交互性?
Asp*_*eri 17
更新 a 中的@State变量PreviewProvider似乎不会直接更新只读计算属性previews。解决方案是将@State变量包装在测试持有者视图中。然后在previews属性内使用此测试视图,以便实时预览正确刷新。在 Xcode 11.2.1 中测试和工作。
struct ChildView: View {
@Binding var itemName: String
var body: some View {
VStack {
Text("Name: \(itemName)")
Button(action: {
self.itemName = "different value"
}) {
Text("Change")
}
}
}
}
struct ChildView_Previews: PreviewProvider {
struct BindingTestHolder: View {
@State var testItem: String = "Initial"
var body: some View {
ChildView(itemName: $testItem)
}
}
static var previews: some View {
BindingTestHolder()
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要一个可以在实时预览中更改的值,我喜欢使用这个辅助类:
struct BindingProvider<StateT, Content: View>: View {
@State private var state: StateT
private var content: (_ binding: Binding<StateT>) -> Content
init(_ initialState: StateT, @ViewBuilder content: @escaping (_ binding: Binding<StateT>) -> Content) {
self.content = content
self._state = State(initialValue: initialState)
}
var body: some View {
self.content($state)
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
struct YourView_Previews: PreviewProvider {
static var previews: some View {
BindingProvider(false) { binding in
YourView(yourBindingVar: binding)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您在实时预览中测试更改绑定。
| 归档时间: |
|
| 查看次数: |
1597 次 |
| 最近记录: |