91

到目前为止,我一直在玩 SwiftUI 并理解BindableObjectsetc 的概念(至少我希望如此)。

我遇到了一个似乎找不到答案的愚蠢问题:如何初始化@Binding变量?

我有以下代码:

struct LoggedInView : View {

    @Binding var dismissView: Bool

    var body: some View {
        VStack {
            Text("Hello World")
        }
    }
}

在我的预览代码中,我想传递 type 的参数Binding<Bool>

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: **Binding<Bool>**)
    }
}
#endif

我将如何初始化它?试过:

Binding<Bool>.init(false)
Binding<Bool>(false)

甚至:

@Binding var dismissView: Bool = false

但没有一个工作......有什么想法吗?

4

5 回答 5

206

当您LoggedInView在您的应用程序中使用您的时,您确实需要提供一些绑定,例如@State来自先前视图或@EnvironmentObject.

对于PreviewProvider您只需要一个固定值的特殊情况,您可以使用.constant(false)

例如

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(false))
    }
}
#endif
于 2019-06-20T13:05:55.147 回答
74

使用Binding.constant(false)很好,但仅适用于静态预览。如果您真的想启动实时预览,constant它的行为方式与真实情况不同,因为它永远不会被您的操作更新。我个人经常使用实时预览,因为我可以玩一个孤立的视图。

这是我为需要的预览所做的Binding

import SwiftUI

struct SomeView: View {
   @Binding var code: String

   var body: some View {
     // some views modifying code binding
   }
}

struct SomeView_Previews: PreviewProvider {
  static var previews: some View {
    PreviewWrapper()
  }

  struct PreviewWrapper: View {
    @State(initialValue: "") var code: String

    var body: some View {
      SomeView(code: $code)
    }
  }
}
于 2020-01-07T10:06:02.613 回答
12
  • 如果你需要一个属于单个视图的简单属性,你应该使用@State
  • 如果您需要拥有可能属于多个视图(如 2-3 个视图)的复杂属性,则应使用 @ObjectBinding
  • 最后,如果您需要拥有需要使用所有周围视图的属性,则应使用@EnvironmentObject详细信息来源

对于您的情况,如果您仍想初始化 Binding 变量,您可以使用:

var binding: Binding = .constant(false)
于 2019-06-20T12:58:29.580 回答
2

在预览中,您必须使用.constant(Bool(false))

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(Bool(false))
    }
}
#endif
于 2022-01-22T13:38:03.047 回答
0

我在一个预览中使用了不同的视图配置(我正在开发一个自定义控件并希望查看它的不同配置)。我扩展了@NeverwinterMoon 提供的实现,以便创建视图的多个独立实例。

struct SomeView: View {
   @Binding var value: Int

   var body: some View {
     // some views modifying code binding
   }
}

struct SomeView_Previews: PreviewProvider {
  static var previews: some View {
    VStack {
      // The same view but with different configurations

      // Configuration #1
      PreviewWrapper() { value in
        SomeView(value: value)
          .background(Color.blue)
      }

      // Configuration #2      
      PreviewWrapper(initialValue: 2) { value in
        SomeView(value: value)
          .padding()
      }
    }
  }

  struct PreviewWrapper<Content: View>: View {
    @State var value: Int
    private let content: (Binding<Int>) -> Content
    
    init(
      initialValue: Int = 0,
      @ViewBuilder content: @escaping (Binding<Int>) -> Content
    ) {
      self.value = initialValue
      self.content = content
    }
    
    var body: some View {
      content($value)
    }
  }
}
于 2021-09-22T09:25:37.480 回答