demo思路:利用KVO实时监听UITableView的数据源数组的变化,无数据展示占位图,否则删除占位图
demo简单实现了无数据展示占位图,有数据时删除占位图,及添加了图片点击回调事件
BJNoDataView使用如下:
@property(nonatomic,strong)NSMutableArray*dataArray;//tableview数组
在viewDidLoad中添加观察者监听tableview的数据变化
[self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew context:nil];//添加观察者self.dataArray=[NSMutableArray array];//初始化数组
KVO回调
#pragma mark-----KVO----
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{
if (![keyPath isEqualToString:@"dataArray"]) {
return;
}
if ([self.dataArray count]==0) {//无数据
[[BJNoDataView shareNoDataView] showCenterWithSuperView:self.tableView icon:nil iconClicked:^{
//图片点击回调
[self loadData];//刷新数据
}];
return;
}
//有数据
[[BJNoDataView shareNoDataView] clear];//删除
}
-(void)dealloc{//移除观察者
[self removeObserver:self forKeyPath:@"dataArray"];
}
效果如下:
注意:1.KVO要配对使用,在控制器的dealloc方法中要移除Observer
2.[self addObserver:self forKeyPath:@"dataArray" options:NSKeyValueObservingOptionNew context:nil];
此方法监听的只是数组的指针,对数组进行添加删除操作不会触发KVO,数组指针指向新数组时触发KVO: self.dataArray=otherArray;
3.KVO就是在运行时派生一个子类重写你的setArray方法,从而监听属性改变.
对数组内容进行操作时调用[[self mutableArrayValueForKey:@"dataArray"] addObject:object];
该方法可以触发KVO,即用[self mutableArrayValueForKey:@"dataArray"]获取数组时触发KVO
[self.dataArray addObject:object]不会触发KVO
数组内容删除同理
网友评论