swiftUI笔记之@Binding

在前面的文章我已用过@State属性,使用@State修饰某个属性后,SwiftUI将会把该属性存储到一个特殊的内存区域内,并且这个区域和View struct是隔离的;
当@State修饰的属性的值发生变化后,SwiftUI会根据该属性重新绘制视图;

在开发中,我们需要把一个View的属性,传递到一个子View中;
Swift中,值传递的形式是值传递,也就是说,传个子View的是值的拷贝;子视图对这个值进行了修改后,不会影响父视图;
使用@Binding修饰后,属性就变成了一个引用类型,这样子视图对值进行了修改后,父视图中的值也会发生变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct customButton:View {
@Binding var tapCount:Int
var body: some View {
Button {
self.tapCount += 1

} label: {
Text("Hello World 第\(tapCount)次点击")
} //渲染颜色
.tint(.purple)
// 按钮样式 .bordered、.borderless 和 .plain
.buttonStyle(.bordered)
//按钮边框样式
.buttonBorderShape(.capsule)
//按钮预设大小
.controlSize(.large)
}
}

struct ContentView: View {
@State private var tapCount = 0
var body: some View {

VStack{
customButton(tapCount: $tapCount)
}
}
}

我们看到我们将tapCount 作为参数传入customButton中,当customButton这个subview内进行点击修改的时候,我们的parentView也会随着变化。