![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
上QQ阅读APP看书,第一时间看更新
5.5 KVO
在如今比较流行的MVVM设计模式中,需要有一种双向绑定的机制,在数据模型发生了修改之后,立即将改变呈现到视图View上去。iOS开发过程中,基于KVO(Key Value Observing)即可实现这种模型和视图的联动机制。
KVO其实是一种观察者模式,利用它可以很容易实现视图View和数据模型的分离。当数据模型的属性值改变之后,作为监听器的视图组件就会触发特定的方法,在该方法中可以获取数据模型变更的数值,从而更新界面UI。
1.KVO中常用的方法
使用KVO的话下方的方法是比较常用的。
- 模型对象注册指定KeyPath的监听方法。通常情况下,当模型对象的指定Key发生变化时,通知视图对象。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T145_17298.jpg?sign=1739541573-PsPjdkqIcBrmq1wLulve1V8OiUoUqnYE-0-b76bc4b8b1dd5ed4bfcecdc2a894f693)
- 视图对象的监听回调方法,在该方法中可以获取数据模型变化前后的数据。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T145_17300.jpg?sign=1739541573-2AZ8Zz5Pq84hMo5LQjR5cLDt61SKQ1U7-0-01d6dac2825f832a67a366588675ed27)
- 删除指定Key路径的监听器。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T145_17302.jpg?sign=1739541573-KB0j0cm94lTAjQ5o52g8ZQ2f4c2co2Hg-0-42099e9d3557c328b1d86bafb09790f5)
2.使用KVO实现模型与视图联动的步骤
当需要使用KVO实现模型与视图的联动操作时,可以使用如下步骤进行:
- 创建数据模型对象,并且注册需要监听的KeyPath。
- 在视图类中,实现监听回调方法,即当收到模型对象指定KeyPath发生变化时,对界面UI执行的更新操作。
3.示例代码
下面的案例中,创建了一个模型类和一个自定义视图类,当模型类的数值发生变化时,会实时反映到界面UI中。
- 创建一个Single View Application工程。
- 定义Person模型类,并添加一个name属性。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T145_17304.jpg?sign=1739541573-8jCqQFucPeeemlTYFKytvQNfQhJhc8Iw-0-3c9b046a8cced91d79d1e4025500f9f1)
- 定义MYLabel视图类,继承自UILabel,在MYLabel.h中添加一个Person类型的属性,该属性为MYLabel提供展示的数据。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T146_17452.jpg?sign=1739541573-v8e15tDrwOGEb4NZXdQmWPSR49yrPmR6-0-632f1d065d85223e1a098dbb5a3ada6d)
- 在MYlabel.m文件中,重写viewData属性的setter方法,当设置viewData属性时,更新MYLabel上的文字显示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T146_17454.jpg?sign=1739541573-tDCvhCnx93t68y8nhKwKT91Ixm5o4BIQ-0-7978c7732b134ffee37c0db1208c01a4)
- 在MYLabel.m文件中,实现视图对象的监听回调方法,该方法在模型数据发生变化时会调用,此时会把数据模型中最新的数据从change参数中获取,等获取到最新的数据后,更新MYLabel的文字显示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T146_17456.jpg?sign=1739541573-14l59pri94K10COSNNErNWR7ClM40mjK-0-00f5e21757d01f7e7936aec8fe627cc2)
- 在ViewController.m文件中,添加Person类型的属性以及MYLabel类型的属性,并对myLabel属性进行懒加载操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T146_82854.jpg?sign=1739541573-dvgQtIybrIX0syicAcZFMBBQEsmFcT5L-0-7c826b24528b8a75291c597e63a55db8)
- 在ViewDidLoad方法中,创建Person类对象,并注册需要监听的KeyPath。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T147_17567.jpg?sign=1739541573-MHMMGYbFIJlEKcdj8AHQNVeds6lzOi1H-0-c353663c17b301ff8a3d92120d4ebf8a)
- 单击屏幕时,更新Person类对象的值,此时会调用MYLabel类中的observeValueForKeyPath:ofObject:change:context:方法,从而更新MYLabel对象的显示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T147_82855.jpg?sign=1739541573-rzIkwjsB7mMajt6Ndql2iTasjXUqaF0s-0-e3d70b24c537f4ca974882ad1b746f78)