美文网首页
iOS19-Runtime学习笔记(二)

iOS19-Runtime学习笔记(二)

作者: echo海猫 | 来源:发表于2020-04-20 20:47 被阅读0次

为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);
}

相关文章

网友评论

      本文标题:iOS19-Runtime学习笔记(二)

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