SwiftUI如何观察并响应状态的改变?

20 min read

在SwiftUI中,观察和响应状态的改变通常使用@State@Binding属性实现。

使用@State属性时,我们可以将它声明在视图结构体中,当该状态值发生改变时,视图会自动重绘。例如:

struct ContentView: View {
  @State var isOn = false
  
  var body: some View {
    VStack {
      Text("Toggle Switch")
      Toggle(isOn: $isOn) {
        Text("Toggle")
      }
    }
  }
}

当用户打开或关闭开关时,isOn状态的值会相应地进行更新,并且该视图将自动刷新。

使用@Binding属性时,我们可以将其作为参数传递给其他视图,从而实现状态的共享和响应。例如:

struct DetailView: View {
  @Binding var isOn: Bool
  
  var body: some View {
    VStack {
      Text("Detail View")
      Toggle(isOn: $isOn) {
        Text("Toggle")
      }
    }
  }
}

struct ContentView: View {
  @State var isOn = false
  
  var body: some View {
    VStack {
      Text("Toggle Switch")
      Toggle(isOn: $isOn) {
        Text("Toggle")
      }
      DetailView(isOn: $isOn)
    }
  }
}

ContentView视图中,将isOn值绑定到DetailView视图中的isOn参数上,从而使其能够获取和响应原值的改变。