KVO监听数组

作者: Claire_wu | 来源:发表于2017-07-12 16:26 被阅读693次

楼主最近遇到一个需求:在某个页面中添加一个collectionView,collectionView的高度随着数据源的长度来改变,从而达到改变父View的高度,如下图红框部分则为collectionView,整个视图布局在scrollview上,由collectionView的高度去撑父视图的高度。楼主试图通过监听collectionView的数据源长度来改变视图高度。

image.png

但我们知道,KVO监听的是指针变化,可变数组里加了个元素,这个数组的内容变了,但是指针没有变,所以不会调用KVO。但还好有万能的简书,楼主搜到一篇文章正合心意,具体可参见:http://www.jianshu.com/p/f9fa928173ae

但楼主发现其实实践起来无需这边博主这么麻烦,我们只要每次都变更我们要监听数据的地址就好了。因此简化版操作如下,mediaUploadView是包含了collectionView的直接父视图,seleteImagesArray为collectionView的数据源

//1.建立观察者以及观察者对象
[self.mediaUploadView addObserver:self forKeyPath:@"seleteImagesArray" options:NSKeyValueObservingOptionNew context:nil];

//2.数组的增删方法(注意这里的写法,用mutableArrayValueForKey,这个不仅把元素加进去了, 而且还重新生成了一个可变数组来赋值给控制器属性的那个数组,这样就能被KVO检测到指针变化)
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] addObject:weakself.addImageModel];
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] removeLastObject];
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] addObjectsFromArray:tempArray];
//3.处理Key的变化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSInteger rows = ceilf(self.mediaUploadView.seleteImagesArray.count/3.0);
    self.meadiaUploadViewHeight.constant = (ITEM_WIDTH_HEIGHT+20)*rows;
}

//4.最后一步也很重要,否则引起崩溃
- (void)dealloc {
    [self.mediaUploadView removeObserver:self forKeyPath:@"seleteImagesArray" context:nil];
}

相关文章

  • KVO如何才能直接监听到数组的变化

    转自关于使用KVO监听数组的问题 首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然...

  • 关于使用KVO监听数组的问题

    首先,数组不能直接使用KVO使用监听。当我们想要使用KVO监听数组的状态时改变然后尽心操作时,我们需要进行一下几部...

  • KVO监听数组

    楼主最近遇到一个需求:在某个页面中添加一个collectionView,collectionView的高度随着数据...

  • iOS监听控制器数组变化

    用KVC监听viewcontroller的数组变化,在控制器里面有一个可变数组属性 若是用KVO监听数组mArra...

  • 使用RAC/KVO监听数组的变化

    iOS默认不支持KVO的形式来监听数组的变化,数组改变的时候,只是数组里面的值变化,但数组的地址没有变化,KVO监...

  • KVO—监听数组长度的变化

    通过KVO监听数组时,当直接通过.语法获取的数组来添加或删除元素时并不会触发KVO,需要通过KVC的方式来获取数组...

  • Swift 中的KVO

    基本类型的监听 包括String、Int、数组等等 Person为被监听的对象,name被监听的属性 KVO是基于...

  • swift中的KVO

    基本类型的监听 包括String、Int、数组等等 Person为被监听的对象,name被监听的属性 KVO是基于...

  • RAC简单使用

    遍历数组 遍历字典 替代delegate(UIAlertView) 替代KVO 监听事件(button/view)...

  • [iOS] KVO监听数组

    对于swift,因为数组是值类型, 操作数组时,didSet 属性观察就可以很容易做到这一点. 对于Objecti...

网友评论

    本文标题:KVO监听数组

    本文链接:https://www.haomeiwen.com/subject/aqbbhxtx.html