数据绑定 @state @Binding,@Environment,@ ObservableObject,@EnvironmentObject

311 阅读1分钟

数据绑定,改变标题 @state

import SwiftUI

// 数据绑定,改变标题

struct StatePage: View {

    @State private var textInput:String = ""

    @State private var title:String = "数据绑定,改变标题"

    var body: some View {

        VStack {

            //不加$是单向

            Text(self.title)

            // 加$是双向绑定

            TextField("请输入内容", text: **self**.$textInput)

                .font(.title)

                .frame(width: UIScreen.main.bounds.width - 20,height: 50,alignment: .center)

                .padding(10)

                .textFieldStyle(RoundedBorderTextFieldStyle())

            Button {
                self.title = self.textInput

            } label: {

                Text("确定按钮")

                    .font(.title)

                    .padding()

                    .background(Color.blue)

                    .foregroundColor(.white)

                    .cornerRadius(15)

            }

        }
    }
}

数据绑定,传递结构 @Binding

import SwiftUI

// 子控件

struct HeaderView:View{

    // 接收父控件的数据

    @Binding var title:String

    var counter:Int = 0

    init(title: Binding<String>) {

        self._title = title

        // 属性包装器

        let sentence = **self._title.wrappedValue

        //计算传进来的文字数量

        self.counter = sentence.count

    }

    var body: some View{

        Text(**self**.title + "/\(**self**.counter)")

    }

}


struct BindingPage: View {

    // 定义数据绑定

    @State private var title:String = "数据绑定"

    var body: some View {

        VStack {

            Text(self.title)

            HeaderView(title: self.$title)

            Button {
                self.title = "失业中 学习swiftUI"
            } label: {
                Text("确定")
                    .font(.title)
                    .padding()
                    .background(Color.green)
                    .foregroundColor(.white)

            }
        }
    }
}

取得系统数据@Environment

import SwiftUI

// 取得系统频道

struct EnvironmentPage: View {

    // 读取系统的颜色变量

    @Environment(\.colorScheme) **var** mode

    var body: some View {

        VStack {

            Text("系统颜色模式:\(mode == .dark ? "暗黑模式" : "白昼模式")")

            // 动态显示

            Text("失业中").font(.largeTitle)

                .padding()

                .background(mode == .dark ? Color.black : Color.yellow)

                .foregroundColor(mode == .dark ? Color.white : Color.black)

                .cornerRadius(15)

        }

    }
}

@观察绑定数据 ObservableObject

import SwiftUI

/***

   *观察者数据绑定*

    *@ObservableObject*

    *@Published*

    *@ObservedObject*

   *1.建立一个类文件,用来存储全局数据*

  


    @EnvironmentObject

 */

// 需要遵守 ObservableObject 协议

class Model:ObservableObject{

    @Published var data = [] // 使用StateObject 属性包装器修饰对象,最少内部需要保证一个被@Publister修饰

    @Published **var** AppTitle:String = "失业中学SwiftUI"

}

// @StateObject 在该视图和共享的其他视图中使用

class User:ObservableObject{

    var username = "@twostrasws"

}

class Player:ObservableObject{

    @Published **var** name = "Taylor"

    @Published **var** age = 25

}

class Student:ObservableObject{

    @Published **var** name = ""

}

  


struct ObservableObjectPage: View {

   @StateObject var model = Model() // 该视图管理

   @StateObject var user = User()

   @StateObject var player = Player()

   @ObservedObject var appDate:AppDate

   @EnvironmentObject **var** user2:Student  // 还是有问题

   let student = Student()

    var body: some View {

       // OtherView(model: model)

        VStack {

            Text("Username: \(user.username)").bold().font(.title)

            Text(**self**.model.AppTitle).bold().font(.largeTitle)

            VStack {

                Text(**self**.appDate.Author).bold().font(.largeTitle)

                //Text(user2.name).bold().font(.largeTitle)

               

            }

            Button {

                self.appDate.Author = "加油"

            } label: {

                Text("更新")

                    .padding()

                    .font(.subheadline)

                    .background(Color.green)

                    .foregroundColor(Color.white)

                    .cornerRadius(15)

            }

  


            

            OtherView(player: player)

           // EditStudentView().frame(width: 30,height: 40.0)

        }

        

        

    }

}

  


struct OtherView:View{

    @ObservedObject **var** player:Player// 由父视图注入

    var body: some View{

        Text("Hello,\(player.name)")

    }

}

访问环境对象 EnvironmentObject