Swift中的双向数据绑定

双向绑定在我们的开发中有时候也是会用到的,比如MVVM中,ViewModel绑定到一个UI控件,当ViewModel发生变化时,控件跟着变化,而当我们改变控件值时,ViewModel也跟着变化。双向绑定是一种双向的观察-监听者模式。下面就探索几种双向绑定方式。

Data binding

RxSwift

使用RxSwift可以很简单的实现双向绑定,我们定义一个ViewModel:

struct UserViewModel {
    var userName = BehaviorRelay<String>(value:"your name")
}

把一个ViewModel的对象绑定到一个UITextField上。

userModel.userName.asObservable().bind(to: textField.rx.text).disposed(by: disposeBag)
textField.rx.text.orEmpty.bind(to: userModel.userName).disposed(by: disposeBag)

此时就实现了双向绑定,我们改变其中一个值,另外一个值也会跟着改变。

也可以使用RxSwift示例代码中给的Operators.swift里面实现的Operator "<->"来做双向绑定,这种方法更加简洁

_= textField.rx.textInput <-> self.userModel.userName

Bond

Bond 是一个基于ReactiveKit实现的绑定库,利用它可以很容易的实现数据绑定操作。

定义ViewModel,

import Bond
import ReactiveKit

struct UserViewModel {
    var isToggleOn = Property<Bool>(false)
}

设置一个UISwitch,并将viewModel的isToggleOn属性绑定到UISwitch的isOn上

userModel.isToggleOn.bidirectionalBind(to: switchOn.reactive.isOn)

这样就实现了双向数据绑定。

参考文章:

https://qianye520.github.io/2018/05/23/RxSwift/Grammar/Two-Way-Binding-%E5%8F%8C%E5%90%91%E7%BB%91%E5%AE%9A/

https://www.raywenderlich.com/667-bond-tutorial-bindings-in-swift

https://codeburst.io/swift-mvvm-two-way-binding-win-b447edc55ff5

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云端架构

【云端架构】前端js键盘绑定事件

在Web开发中,有时候我们可能会把页面中的某些按钮绑定到键盘的输入事件中。以下代码能方便实现我们需要的功能。

386100
来自专栏Golang语言社区

Golang语言 上传文件

import ( "bufio" "flag" "fmt" "io" "log" "os" "os/ex...

32940
来自专栏landv

vb.net 结束进程

17630
来自专栏一个爱瞎折腾的程序猿

asp.net mvc项目自定义区域

2.Code:在Global.asax中添加注册区域-->AreaRegistration.RegisterAllAreas();

16810
来自专栏数说工作室

【SAS Says】基础篇:ODS的使用(上)

你不可能总是在SAS上查看结果,如果结果很多你要一一的讲结果复制到word中去,有ODS就好啦!它可以把SAS的结果直接输出到word、PDF等文件中。 5.1...

79060
来自专栏GIS讲堂

Arcgis for js加载天地图

天地图的切片地图可以通过esri.layers.TiledMapServiceLayer来加载,在此将之进行了一定的封装,如下:

79320
来自专栏张高兴的博客

张高兴的 UWP 开发笔记:手机状态栏 StatusBar

35250
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(46)-工作流设计-设计分支

步骤设置完毕之后,就要设置好流转了,比如财务申请大于50000元(请假天数>5天)要总经理审批,否则财务审批之后就结束了。 ? 设置分支没有任何关注点,我们把关...

37170
来自专栏Golang语言社区

go语言实现通过FTP库自动上传web日志

因为平时管理的web服务器都是VM服务器,为节省硬盘空间,一般给虚拟机分配的硬盘空间都比较小,只有8G,因为,保存不了多少日志,所以每天都需要把每台WEB日志转...

44830
来自专栏张高兴的博客

张高兴的 UWP 开发笔记:汉堡菜单进阶

44960

扫码关注云+社区

领取腾讯云代金券