NOTE \ SwiftUI中的数据流控制(一)各种State
SwiftUI会根据View(视图)中包含数据的变化自动刷新,因此其设计了多种Property Wrapper(属性包装器)来实现不同效果的状态控制。
@State @Binding @AppStorage @SceneStorage…
在SwiftUI中,用户的行为Action会改变UI的状态State,进而UI会更新与这种状态相关联的视图界面View。因此这种State起到控制视图变化的作用。
@State
创建一个可以控制视图变化的值类型变量
struct PlayerView: View {
var episode: Episode
@State private var isPlaying: Bool = false
var body: some View {
VStack {
Text(episode.title)
Text(episode.showTitle)
PlayButton(isPlaying: $isPlaying)
}
}
}//来自AppleDocumentation
功能
@State isPlaying使得SwiftUI会在isPlaying改变后刷新本视图(PlayerView)中所有与isPlaying相关的UI。若不加@State包装器,此时isPlaying值的变化都不会引起UI的变化,只有通过某些手段刷新视图后才能看到相应的改变。
在上面的代码中,playButton的状态会跟随isPlaying 值一起变化。其中 $isplaying使得playButton这个子视图可以动态获得并且修改isPlaying的值。
结构
当使用 @State来包装isPlaying 时,实际上产生了
-
包含wrappedValue和projectedValue两个值的结构体_isPlaying
- wrappedValue: Bool
- projectedValue: Binding<Bool>
-
原名称前添加‘ ’ 前 缀 的 ∗ ∗ ’前缀的 ** ’