SwiftUi:视图绑定

前言

  @State

  @Binding

   //链式拓展视图

一.State


  State  用于单结构体视图里面的视图监视绑定

        当变量数据的变化,视图也跟着变化

        涉及到单个 struct视图        

@State var a : Bool = true

Button(action : 
{
  self.a.toggle()  
})
{
  Text(self.a ? "a" : "b")  
}

二.Binding


  Binding  用于父视图和子视图进行数据共享

        当父视图的数据变化,子视图的数据也跟着变化

        当子视图的数据变化,父视图的数据也跟着变化

        涉及到两个 struct视图,一个父视图一个子视图 

struct fatherView : View
{
  @State var a : Bool = true
  var body : some View
  {
      VStack
      {
          Text(self.a ? "a" : "b")
          sonView(b : $a)    
      }        
  }      
}

struct sonView : View
{
  @Binding var b : Bool
  var body : some View
  {
      Button(action : {
          self.b.toggle()
      })  
      {
          Text(self.b ? "b" : "a")
      }
  }
}

三.ObservedObject


  ObservedObject   用于 class 和 struct视图之间的传值

             当struct视图采用class里面的数据时候,class数据变化,struct视图也会跟着变化

             涉及到 class数据和 struct父视图

class fatherClass : ObservableObject
{
  @Published var c : Bool = true

  init(C : Bool)
  {
      self.c = C      
  }        
func a()
{
self.c.toggle()
}
}
struct ContentView : View { @ObservedObject var fatherclass : fatherClass(C : true) var body : some View { Button(action :{ self.fatherclass.c.toggle()
//self.fatherclass.a() }) { Text(fatherclass.c
? "a" : "b") } } }
class DataSource : ObservableObject
{
    @Published var counter = 0
}


struct ContentView: View
{
    @ObservedObject var dataSource = DataSource()
    var body: some View {
        NavigationView
        {
            VStack
            {
                Button(action:
                {
                    dataSource.counter += 1
                })
                {
                    Text(dataSource.counter.description)
                }
                
            }
        }
    }
}

四.Environment


  Environment  用于 class 和两个 struct视图之间的传值

           应用于多场景数据分享

           设计到 class数据和 一个stuct 父视图和 struct 子视图

class DataSource : ObservableObject
{
    @Published var counter = 0
}


struct ContentView: View
{
   // let dataSource = DataSource()
    @ObservedObject var dataSource : DataSource = DataSource()
    var body: some View {
        NavigationView
        {
            VStack
            {
                Button(action:
                {
                    dataSource.counter += 1
                })
                {
                    Text(dataSource.counter.description)
                }
                NavigationLink(destination: sonView()) {
                    Text("Enter")
                }
                
            }
        }
            .environmentObject(dataSource)
    }
}

struct sonView : View
{
    @EnvironmentObject var dataSource : DataSource
    var body : some View
    {
        Text("(dataSource.counter)")
    }
}
原文地址:https://www.cnblogs.com/k5bg/p/14350220.html