加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

SwiftUI数据流是怎么在View间传递的

发布时间:2021-04-12 15:57:09 所属栏目:动态 来源:互联网
导读:用@State包装的变量是可以被SwiftUI读取的值,这些值通常是一些字符串或数字等常量值。 当被State包装的属性改变时,SwiftUI会重新计算和绘制使用到该属性的视图所在的整个视图层级,通常是说变量所在View的Body会被重新绘制,在本例子中就是指ContentView的

用@State包装的变量是可以被SwiftUI读取的值,这些值通常是一些字符串或数字等常量值。

当被State包装的属性改变时,SwiftUI会重新计算和绘制使用到该属性的视图所在的整个视图层级,通常是说变量所在View的Body会被重新绘制,在本例子中就是指ContentView的body。

被@State包装的变量一定要用private修饰,并且这个变量只能在当前view以及其子View的body中使用。

正如TextField中的$title一样,我们可以通过*$*前缀把变量和另一个view绑定起来,这样就可以在另一个view中对这个变量进行修改了。下面的代码使用一个Toggle来控制Wi-Fi的开关:如上面的代码所示,我们在isOn属性和Toggle控件之间建立了一个绑定。Toggle可以修改isOn的值,另外当isOn改变的时候,Text和Image的内容都会发生变化。

State Binding 状态绑定

使用@state包装的属性只在它所属view的内部使用,那么当它的子视图要访问这个属性的时候就要用到@binding了。就像上面例子用到的Toggle,我们把Text和Image放到一个自定义的View中。里我们使用了@Binding来创建数据和界面之间的依赖,它和@State不同的地方在于,binding的属性并不被当前的视图所持有,并且binding的值是可以被state的属性值导出的。

在这里如果把@Binding换成@State就会使WiFiView和它的父视图分别拥有各自的isOn属性,其中一个修改不会影响到另一个,而这显然不是我们想要的结果。

使用Combine框架的Publisher

使用@State包装的属性只能在当前View内部或者它的子视图中使用,并且state属性时临时的——由于state包装的属性是隶属于它所在view的,当view被销毁时对应的state属性也会消失,这明显是不够的,另外我们在开发过程中还要处理一些非界面的信息,比如说Timer、Notification等,它们携带的信息通常也会有更新界面的需求。这种情况就要用到Combine中的Publisher了。

Combine是在iOS13中被引入的,主要目的是为了处理App中的各种事件消息。如果你之前接触过RxSwift或者ReactiveCocoa那你对这个概念应该很容易理解,它的原理就是发布者和订阅者的模式。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!