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)")
    }
}
复制代码

 

posted @   言午丶  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示