在前面的文章我已用过@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也会随着变化。