SwiftUI @Binding初始化

CRE*_*8IT 6 ios swift ios13 swiftui

BindableObjects到目前为止,我一直在使用SwiftUI并了解etc 的概念(至少我希望我这样做)。

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

我有以下代码:

struct LoggedInView : View {

    @Binding var dismissView: Bool

    var body: some View {
        VStack {
            Text("Hello World")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的预览代码中,我想传递以下类型的参数Binding<Bool>:

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

我将如何进行初始化?尝试过:

Binding<Bool>.init(false)
Binding<Bool>(false)
Run Code Online (Sandbox Code Playgroud)

甚至:

@Binding var dismissView: Bool = false
Run Code Online (Sandbox Code Playgroud)

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

Nev*_*oon 69

使用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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这还不够,因为它不起作用,与提议的解决方案不同。使用 static var 时,属性值不会更新,并且其工作方式与使用 Binding.constant 相同 - 这仅适用于静态预览。 (2认同)

Pau*_*w11 22

LoggedInView在您的应用中使用时,您确实需要提供一些绑定,例如@State上一个视图中的或@EnvironmentObject。

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

例如

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(false))
    }
}
#endif
Run Code Online (Sandbox Code Playgroud)

  • 对于静态预览,使用不可变的 Binding.constant 很好,但对于实时预览来说它完全无法使用,我只想玩一个视图并查看值的变化。 (2认同)

ata*_*asa 11

  • 如果您需要属于单个视图的简单属性,则应使用@State
  • 如果您需要拥有可能属于多个视图(如 2-3 个视图)的复杂属性,则应使用 @ObjectBinding
  • 最后,如果您需要拥有需要使用所有视图的属性,则应使用@EnvironmentObject。详细信息来源

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

var binding: Binding = .constant(false)
Run Code Online (Sandbox Code Playgroud)