美文网首页
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