【问题标题】:SwiftUI preview provider with binding variables具有绑定变量的 SwiftUI 预览提供程序
【发布时间】:2020-05-23 02:49:02
【问题描述】:

如何为具有绑定属性的视图生成预览提供程序?

struct AddContainer: View {
    @Binding var isShowingAddContainer: Bool
    var body: some View {
        Button(action: {
                self.isShowingAddContainer = false
            }) {
                Text("Pop")
            }
    }
}

struct AddContainer_Previews: PreviewProvider {
    static var previews: some View {
        // ERROR HERE <<<-----
        AddContainer(isShowingAddContainer: Binding<Bool>()
    }
}

在上面的代码中,如何在视图的初始化程序中传递Binding&lt;Bool&gt; 属性?

【问题讨论】:

标签: swift binding swiftui


【解决方案1】:

如果你想观看绑定:

[“静态变量”变体和“常量(.false)”变体上面的两种解决方案都适用于查看静态的预览。但是您不能看不到/观看按钮操作预期值的变化,因为使用此解决方案您只能获得静态预览

如果您想真正观察(在生活预览中)这种变化,您可以轻松地在 PreviewProvider 中实现一个嵌套视图,以 - 比方说 - 模拟 两个 个地方(在 一个 预览中)。

import SwiftUI

struct BoolButtonView: View {
    @Binding var boolValue : Bool
    var body: some View {
        VStack {
            Text("The boolValue in BoolButtonView = \(boolValue.string)")
                .multilineTextAlignment(.center)
                .padding()
            Button("Toggle me") {
                boolValue.toggle()
            }
            .padding()
        }
    }
}

struct BoolButtonView_Previews: PreviewProvider {
    
    // we show the simulated view, not the BoolButtonView itself
    static var previews: some View {
        OtherView()
            .preferredColorScheme(.dark)
    }
    
    // nested OTHER VIEW providing the one value for binding makes the trick
    struct OtherView : View {
        
        @State var providedValue : Bool = false
        
        var body: some View {
            BoolButtonView(boolValue: $providedValue)
        }
    }
}

【讨论】:

    【解决方案2】:

    其他方式

        struct AddContainer_Previews: PreviewProvider {
          static var previews: some View {
            AddContainer(isShowingAddContainer: .constant(false))
          }
        }
    

    【讨论】:

    • 虽然.constant(false) 绑定在大多数情况下就足够了:变量@State 使您可以在预览中添加一个按钮,在运行模式下更改预览中的值。这样你就可以在运行模式的预览中直接看到你@State/@Binding的效果了
    【解决方案3】:

    只需创建一个本地静态变量,将其标记为@State 并将其作为绑定传递$

    struct AddContainer_Previews: PreviewProvider {
      @State static var isShowing = false
      static var previews: some View {
        AddContainer(isShowingAddContainer: $isShowing)
      }
    }
    

    【讨论】:

    • 感谢工作!但是为什么我在这里需要静态而不是在我的主视图中?这仍然让我感到困惑
    • 因为 PreviewProvider 协议是静态协议。来自 Apple 文档:“Xcode 在您的应用程序中静态发现符合 PreviewProvider 协议的类型,并为它发现的每个提供程序生成预览。” static var previews 只能访问静态变量。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多