为UITableView 添加Category,实现数据为空的界面显示
可以根据如下代码加新的属性,只要在.m文件中实现setter和getter方法即可。这个只是提供一个思想,利用runtime转发消息的机制做一个方法交换,交换UITableView的reloadData为自己的方式,然后获取UITableView的dataSource,从而获取到它的section和row,得知row为0,即数据为空,此时可以显示分类实现的空view。不用自己再每个用的的列表中添加方法,节省了时间,也节省了代码
.h文件实现如下:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UITableView (Empty)
/// 空背景view -- 可自定义自己的空view 在里面修改即可
@property(nonatomic, strong) UIView *yg_emptyView;
/// 空背景view的颜色
@property(nonatomic, strong) UIColor *yg_emptyColor;
@end
NS_ASSUME_NONNULL_END
.m文件实现如下:
#import "UITableView+Empty.h"
#import <objc/runtime.h>
static char YG_emptyView;
static char YG_emptyColor;
@implementation UITableView (Empty)
+(void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method sys_reload = class_getInstanceMethod(self, @selector(reloadData));
Method yg_reload = class_getInstanceMethod(self, @selector(yg_reloadData));
method_exchangeImplementations(sys_reload, yg_reload);
});
}
- (void)yg_reloadData{
//调用reloadData
[self yg_reloadData];
//判断是否为空,然后添加空白view
[self addEmptyViewForTableView];
}
- (void)addEmptyViewForTableView{
//获取datasource数据
id<UITableViewDataSource> dataSource = self.dataSource;
if ([dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)]) {
NSInteger setion = [dataSource numberOfSectionsInTableView:self];
NSInteger row = 0;
//遍历section 获取row
for (int i = 0; i< setion; i++) {
row = [dataSource tableView:self numberOfRowsInSection:setion];
}
//空 没有row
if (!row) {
self.yg_emptyView = [[UIView alloc]initWithFrame:self.bounds];
if (self.yg_emptyColor) {
self.yg_emptyView.backgroundColor = self.yg_emptyColor;
}else{
self.yg_emptyView.backgroundColor = self.backgroundColor;
}
[self addSubview:self.yg_emptyView];
self.yg_emptyView.hidden = NO;
}else{
self.yg_emptyView.hidden = YES;
}
}
}
#pragma mark - 属性的setter 和 getter方法
- (void)setYg_emptyView:(UIView *)yg_emptyView{
//建立绑定
objc_setAssociatedObject(self, &YG_emptyView, yg_emptyView, OBJC_ASSOCIATION_RETAIN);
}
- (UIView *)yg_emptyView{
return objc_getAssociatedObject(self, &YG_emptyView);
}
- (void)setYg_emptyColor:(UIColor *)yg_emptyColor{
//建立绑定
objc_setAssociatedObject(self, &YG_emptyColor, yg_emptyColor, OBJC_ASSOCIATION_RETAIN);
}
- (UIColor *)yg_emptyColor{
return objc_getAssociatedObject(self, &YG_emptyColor);
}
网友评论