SwiftUI @Binding 初始化

问题描述 投票:0回答:7

到目前为止一直在使用 SwiftUI 并理解

BindableObjects
等概念(至少我希望如此)。

我遇到了一个愚蠢的问题,我似乎找不到答案: 如何初始化

@Binding
变量?

我有以下代码:

struct LoggedInView : View {

    @Binding var dismissView: Bool

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

在我的预览代码中,我想传递

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

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

ios swift swiftui ios13
7个回答
213
投票

当您在应用程序中使用

LoggedInView
时,您确实需要提供一些绑定,例如来自先前视图的
@State
@EnvironmentObject

对于

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

例如

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

83
投票

使用

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)
    }
  }
}

12
投票
  • 如果您需要一个属于单个视图的简单属性,您可以 应该使用 @State
  • 如果您需要拥有复杂的财产,可能 属于您应该使用的多个视图(例如 2-3 个视图) @ObjectBinding
  • 最后,如果您需要拥有需要使用周围视图的属性,您应该使用@EnvironmentObject。 来源了解详细信息

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

var binding: Binding = .constant(false)

2
投票

在预览中你必须使用

.constant(Bool(false))
:

#if DEBUG
struct LoggedInView_Previews : PreviewProvider {
    static var previews: some View {
        LoggedInView(dismissView: .constant(Bool(false))
    }
}
#endif

1
投票

如果你有一个像 viewModel 这样的对象,你也可以使用 .constant()

struct View_Previews: PreviewProvider {
  static var previews: some View {
     View(vm:.constant(ViewModel(text: "Sample Text")))
  }
}

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)
    }
  }
}

0
投票

没有

static
和动态。

struct MyView: View {
    
    @Binding var date: Date
    
    var body: some View {
        DatePicker("Select date", selection: $date)
    }
}

#Preview {
    @State var previewDate: Date = Date()
    return MyView(date: $previewDate)
}
© www.soinside.com 2019 - 2024. All rights reserved.