美文网首页
@Binding 介绍

@Binding 介绍

作者: xiaofu666 | 来源:发表于2023-02-24 15:25 被阅读0次

一种属性包装类型,可以读取和写入真理源所拥有的值。

使用绑定在存储数据的属性与显示和更改数据的视图之间创建双向连接。绑定将属性连接到存储在其他地方的真值源,而不是直接存储数据。例如,在播放和暂停之间切换的按钮可以使用“绑定”属性包装器创建到其父视图的属性的绑定。

  struct PlayButton: View {
      @Binding var isPlaying: Bool
 
      var body: some View {
          Button(isPlaying ? "Pause" : "Play") {
              isPlaying.toggle()
          }
      }
  }

父视图声明一个属性来保持播放状态,使用“state”属性包装器来指示该属性是值的真实来源。

  struct PlayerView: View {
      var episode: Episode
      @State private var isPlaying: Bool = false
 
      var body: some View {
          VStack {
              Text(episode.title)
                  .foregroundStyle(isPlaying ? .primary : .secondary)
              PlayButton(isPlaying: $isPlaying) // Pass a binding.
          }
      }
  }

当“PlayerView”初始化“PlayButton”时,它将其状态属性的绑定传递到按钮的绑定属性中。将“$”前缀应用于属性包装值将返回其“State/projectedValue”,对于状态属性包装器,该值将返回到该值的绑定。

每当用户点击“PlayButton”时,“PlayerView”就会更新其“isPlaying”状态。

 @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
 @frozen @propertyWrapper @dynamicMemberLookup public struct Binding<Value> {

     /// 绑定的事务。
     ///
     /// 当绑定值更改时,事务捕获更新视图所需的信息。
     public var transaction: Transaction
    
     /// 使用读取和写入绑定值的闭包创建绑定。
     ///
     /// - 参数:
     ///   - get: 检索绑定值的闭包。闭包没有参数,并返回一个值。
     ///   - set: 设置绑定值的闭包。闭包具有以下参数:
     ///       - newValue: 绑定值的新值。
     public init(get: @escaping () -> Value, set: @escaping (Value) -> Void)
    
     /// 创建具有从绑定值读取的闭包和在写入绑定值时应用事务的闭包的绑定。
     ///
     /// - 参数:
     ///   - get: 用于检索绑定值的闭包。闭包没有参数,并返回一个值。
     ///   - set: 用于设置绑定值的闭包。闭合具有以下参数:
     ///       - newValue: 绑定值的新值。
     ///       - transaction: 设置新值时要应用的事务。
     public init(get: @escaping () -> Value, set: @escaping (Value, Transaction) -> Void)
    
     /// 创建具有不可变值的绑定。
     ///
     /// 使用此方法可以创建到无法更改的值的绑定。这在使用“PreviewProvider”查看视图如何表示不同值时非常有用。
     ///
     ///     // 绑定到不可变值的示例。
     ///     PlayButton(isPlaying: Binding.constant(true))
     ///
     /// - 参数值:一个不可变值。
     public static func constant(_ value: Value) -> Binding<Value>
    
     /// 绑定变量引用的基础值。
     ///
     /// 此属性提供对值数据的主要访问。但是,您不能直接访问“wrappedValue”。而是使用使用“绑定”属性创建的属性变量。在以下代码示例中,绑定变量“isPlaying”返回“wrappedValue”的值:
     ///
     ///     struct PlayButton: View {
     ///         @Binding var isPlaying: Bool
     ///
     ///         var body: some View {
     ///             Button(isPlaying ? "Pause" : "Play") {
     ///                 isPlaying.toggle()
     ///             }
     ///         }
     ///     }
     ///
     /// 当可变绑定值更改时,新值立即可用。但是,对显示值的视图的更新是异步进行的,因此视图可能不会立即显示更改。
     public var wrappedValue: Value { get nonmutating set }
    
     /// 返回绑定的绑定值的投影。
     ///
     /// 使用投影值将绑定值向下传递到视图层次结构。要获取“projectedValue”,请在属性变量前面加上“$”。例如,在下面的代码示例中,“PlayerView”使用“$sPlaying”将状态属性“isPlaying”的绑定投影到“PlayButton”视图。
     ///
     ///     struct PlayerView: View {
     ///         var episode: Episode
     ///         @State private var isPlaying: Bool = false
     ///
     ///         var body: some View {
     ///             VStack {
     ///                 Text(episode.title)
     ///                     .foregroundStyle(isPlaying ? .primary : .secondary)
     ///                 PlayButton(isPlaying: $isPlaying)
     ///             }
     ///         }
     ///     }
     ///
     public var projectedValue: Binding<Value> { get }
    
     /// 从另一个绑定的值创建绑定。
     public init(projectedValue: Binding<Value>)
    
     /// 返回给定键路径的结果值的绑定。
     ///
     /// - 参数keyPath:指向特定结果值的键路径。
     ///
     /// - 返回:新绑定。
     public subscript<Subject>(dynamicMember keyPath: WritableKeyPath<Value, Subject>) -> Binding<Subject> { get }
 }

相关文章

网友评论

      本文标题:@Binding 介绍

      本文链接:https://www.haomeiwen.com/subject/ulsxldtx.html