ios obj-c KVO模式的介绍和使用

news/2024/7/20 22:12:04 标签: ios, object-c, KVO

在项目需求中,其中有一个需求是监听某个自定义View的隐藏显示来进行其他操作,比如说自定义View里面有个UITextField,当软键盘显示时,隐藏该自定义View的时候需要把软键盘也隐藏掉,这时候如果在依赖该自定义view的类当中进行判断的话,需要把每一次隐藏该自定义View的地方都进行一次隐藏软键盘的操作。

操作软键盘的人都知道软键盘都是依赖UITextField的对象的,哪个UITextField对象显示的软键盘,就用哪个UITextField的对象隐藏软键盘。可能我比较菜,不知道有更便捷的方法。

//通过UITextField对象隐藏软键盘
[self.textField resignFirstResponder];

//——————–可爱的分割线———————————

以上都是废话,接下来才是kvo相关的,哈哈

KVO是键值观察者(key-value-observing)的意思,是指对一个对象当中的属性进行监听变化的操作,ios中的一种观察者模式。

具体的操作就是对某个对象中的某个属性以字符串的形式进行注册它(需要监听的属性)的观察者,指定谁来观察它,然后该属性进行变化的时候,然后该属性的观察者就能收到消息,第一时间知道它改变了,收到消息的观察者就会做出相应的操作。观察者模式有助于两个类进行解耦合。

//注册的方法
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
  • observer:观察者对象,指定谁来观察该属性
  • keyPath:需要观察的属性,以字符串形式
  • options:属性配置,四种模式
    1. NSKeyValueObservingOptionNew:属性改变后才进行通知观察者
    2. NSKeyValueObservingOptionOld:属性改变前就通知观察者
    3. NSKeyValueObservingOptionInitial:注册后就发送通知观察者
    4. NSKeyValueObservingOptionPrior:属性改变前和改变后都会通知观察者,相当于改变一次,通知两次
  • context:用来区分消息的上下文
//属性改变后回调给观察者
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSKeyValueChangeKey, id> *)change context:(nullable void *)context;
  • keyPath:观察的属性
  • object:观察者的对象
  • change:对应注册方法的options参数,字典类型,存储配置的类型,可以进行判断改变状态
  • context:上下文,用来区分消息的来源

//——————–可爱的分割线———————————

好了,最开始讲解了需求,之后又简单的说明了KVO模式,然后接下来就是KVO的使用,也就是利用KVO模式解决以上需求,然后更好地对自定义类的封装。(作为一个稍微有点逼格的程序员,至少要能封装点东西,还要会点设计模式,哈哈哈)

上面说了,自定义View隐藏之后,如果软键盘有显示的话,要跟着隐藏,在没有使用kvo的时候,自定义View本身是不知道自己什么时候会隐藏的,所以会在依赖该自定义View的类当中,在该自定义View隐藏的时候,对软键盘进行隐藏,这时候该自定义View就得暴露个方法进行隐藏软键盘,这时候耦合性就增加了。

这时候kvo模式登场,让自定义view自己监听自己是否隐藏还是显示,如果是显示状态改变为隐藏状态,让其软键盘隐藏。

[self addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:nil];

然后自己实现回调方法:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    if (self==object&&[@"hidden" isEqualToString:keyPath]) {

        if ([[change objectForKey:@"new"] intValue]==1) {
            [self.textField resignFirstResponder];
            NSLog(@"self的hidden属性改变了%@",[change objectForKey:@"new"]);
        }else{
            NSLog(@"self的hidden属性改变了%@",[change objectForKey:@"new"]);
        }

    }
}

这时候就不需要暴露一个隐藏软键盘的方法了,在依赖该自定义View的类中,任何地方隐藏自定义View,软键盘都会跟着消失,哈哈哈哈,最后提醒下,在该自定义View中的结束方法中移除掉该kvo,不然会占用无用的资源。

- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
- (void)removeObserver:(NSObject *)observer     forKeyPath:(NSString *)keyPath  context:(void *)context
-(void)removeFromSuperview{
    [self removeObserver:self forKeyPath:@"hidden"];
}

QQ:361561789
有事可以直接加Q联系


http://www.niftyadmin.cn/n/994352.html

相关文章

.net 软件注册功能的简单实现

相信很多初学编程的人都会对这个软件注册功能很感兴趣&#xff0c;我也不例外&#xff0c;刚学asp.net时&#xff0c;竞找不到这方面的实例&#xff0c;结果自己参考微软的一些文档自己做了一个&#xff0c;其实我做的这个注册功能很简单&#xff0c;读取计算机的CPU序列号&…

python Docker 查看私有仓库镜像

pip 安装&#xff1a; 首先安装epel扩展源&#xff1a;yum -y install epel-release更新完成之后&#xff0c;就可安装pip&#xff1a;yum -y install python-pip安装完成之后清除cache&#xff1a;yum clean all request模块安装&#xff1a; pip install request #!/usr/bin/…

博客园的故事-愤怒时的呐喊

从前有一个寺院&#xff0c;据说是由一位高僧创办&#xff0c;居创办以来&#xff0c;陆续有业界大牛和武林高手前来传道&#xff0c;据说是全国第一&#xff0c;可以将.net修炼到第十层&#xff0c;达到金刚不破之身&#xff0c;一时寺院名气大震&#xff0c;江湖上的名人志士…

刚开学就找到毕业实习,交大学生被支付宝抢着要

又到9月开学季&#xff0c;懵懵懂懂的大一新生享受着高年级师兄师姐的阳光普照&#xff0c;另一边&#xff0c;大二学生就面临着“姥姥不疼舅舅不爱”的尴尬处境了。不过&#xff0c;对于上海交大安泰经济与管理学院的大二学生徐舒怡来说&#xff0c;开学第一天收获一个大大大的…

ios 删除线的obj-c实现和swift实现

删除线&#xff0c;有几种实现思路 一种是用富文本实现 一种是继承uilabel&#xff0c;重写draw方法&#xff0c;画出来 一种是用分类&#xff08;swift用拓展&#xff09;实现 ….. 在这里我觉得画出来是最好看的&#xff0c;所以&#xff0c;我采用了第二种&#xff0c;画…

云课堂如何培养下一代创新思辨的能力?

云课堂还未普遍在各大中小学校应用之前&#xff0c;国内单一的教学模式&#xff0c;一直以来都被国内的教育学者吐槽&#xff0c;认为这种单一的教学模式不能够给下一代带来创新思考能力。老师讲&#xff0c;学生听作为长期以来国内教育的教学模式&#xff0c;短时间内根本改变…

如何开启SQL Server 2005 Express的远程访问功能

如何开启SQL Server 2005 Express的远程访问功能 在用户使用默认选项安装的SQL 2005 Express是不能进行远程连接的&#xff0c;所以需要一些额外的步骤&#xff1a; 1、是否SQL 2005 Express服务未允许远程连接&#xff1f; 解决办法是在Management Studio Express中新建一个…

LL(1)文法判断

这是这次课程设计的题目&#xff0c;刚接手感觉很是麻烦&#xff0c;可是慢慢写写&#xff0c;分析一下感觉不是很难。后来从网上找了一个哥们写的LL(1)文法的C#程序&#xff0c;看了感觉很是好&#xff0c;只是少了判断做递归。我用了1个小时加上判断做递归&#xff0c;然后又…