首页 > 解决方案 > SwiftUI 实时预览中的可变绑定

问题描述

我有一个带有变量的 ChildView:

@Binding var itemName: String

在这个 ChildView 中,我有几个按钮可以更改变量的值:

Button(action: {
    self.itemName = "different value"
})

我试图像这样使用预览:

struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildView(itemName: "test")
    }
}

但我收到一个错误:

无法将“字符串”类型的值转换为预期的参数类型“绑定”

我知道我可以使用如下所示的预览。并且错误将消失并且预览将起作用,但是... itemName 将具有恒定值,它现在不会是可变的,在实时预览中不是交互式的:

struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildView(itemName: .constant("test"))
    }
}

如何在 SwiftUI Preview 中声明绑定以使其具有交互性?

标签: swiftxcodeswiftui

解决方案


更新 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()
    }
}

推荐阅读