如何在 Xcode 15 中为带有 @Binding 的视图创建 SwiftUI #Preview

de.*_*de. 18 ios swift swiftui xcode15

如果我想为包含 @Binding 的 SwiftUI 视图创建预览,我之前会编写如下内容:

struct SpecialButton_Preview: PreviewProvider {
    static var previews: some View {
        @State var value: Bool = true
        SpecialButton(isOn: $value)
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,Xcode 15 现在配备了新语法(#Preview),但当我尝试添加示例状态属性时,它不起作用:

#Preview {  // Error: Ambiguous use of 'Preview(_:traits:body:)'
    @State var value: Bool = true
    SpecialButton(isOn: $value)
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mik*_*ron 27

您需要返回视图才能预览。我不太确定这是如何工作的,它与 Swift 宏的工作方式有关。

#Preview {
    @State var value: Bool = true
    return SpecialButton(isOn: $value)
}
Run Code Online (Sandbox Code Playgroud)

来自 WWDC Slack:“新#Previews宏只需要一个返回要预览的内容的闭包。因此您可以在其中声明局部变量或进行其他必要的设置,就像在任何其他闭包中一样。”

编辑:这仅在您不想更新状态时才有效,否则您必须按照de.

  • 执行此操作并更新 @State 变量实际上不会触发视图更新。需要将其包装到包装视图中,如下面“de.”建议的那样。 (2认同)

de.*_*de. 21

这就是我为了获得可变值而最终所做的事情:


#Preview {
    struct PreviewWrapper: View {
        @State var value: Bool = true
        
        var body: some View {
            SpecialButton(isOn: $value)
        }
    }
    return PreviewWrapper()
}

Run Code Online (Sandbox Code Playgroud)

  • 是的,我还使用预览包装器来完成真正的有状态预览。否则,状态值将不会触发预览更新。 (2认同)

Chr*_*isR 5

你以前可以做的和现在仍然可以做的是:

SpecialButton(isOn: .constant(true))
Run Code Online (Sandbox Code Playgroud)