swift ui 数据绑定二传递结构体

220 阅读2分钟

前言 :

最近在学习iOS swift ui 里面的数据绑定 ,这是第二小节 传递结构体 想着分享给大家。

效果图:

  • 改变前

6865547-72d00bb29efdcd6b.png

  • 改变后

6865547-bfcafb184d7b770c.png

具体实现 :

  • 普通绑定

struct ContentView: View {
    @State private  var  title:String="旋涡名人"
    var body: some View {
        VStack {
            Text(self.title)
                .padding()
            Button(
                action: {
                    self.title="宇智波佐助"
                }, label: {
                    Text("确定")
                        .font(.largeTitle)
                          .padding()
                          .background(Color.blue)
                         .foregroundColor(.white)
                          .cornerRadius(15)
                }
            )
        }

    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

上面的代码片段我们简单分析一些 通常我们要在点击一个button的时候改变 标题的内容 我们可以像上面这样去操作 在action 属性里面去操作 可以理解为button点击事件里面去处理 这样虽然能实现需求但是随着我们需求变多 代码量变大我们不推荐这种方式

  self.title="宇智波佐助"

我们只需要self.title 将我们变量重新赋值 那么我们点击button之后 标题内容就会发生改变

  • 传递结构体来绑定数据

import SwiftUI
struct HeadView: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 ContentView: View {
    @State private  var  title:String="旋涡名人"
    var body: some View {
        VStack {
            Text(self.title)
                .padding()
            HeadView(title:self.$title)
            Button(
                action: {
                    self.title="宇智波佐助"
                }, label: {
                    Text("确定")
                        .font(.largeTitle)
                          .padding()
                          .background(Color.blue)
                         .foregroundColor(.white)
                          .cornerRadius(15)
                }
            )
        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我们通过属性包装器 将我们要显示的view 抽离出来 然后绑定到我们button点击事件上面 也能实现我们将代码更好解耦和抽离代码

最后总结:

swift ui 使用了 属性包装器 来时实现和其他语言的一样的数据绑定的效果 同学们有兴趣可以私下多研究。最后希望我的文章和笔记能帮助到各位同学学习和工作。