博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS自定义控件:自定义TableView、CollectionView空数据占位图
阅读量:6365 次
发布时间:2019-06-23

本文共 3887 字,大约阅读时间需要 12 分钟。

最近由于业务需求,需要封装这样的一个提示页面。看了网上方法感觉都大同小异,其中是很好的一个库,但是对我个人而言有点大财小用了。所以就借鉴一下其方法,自己封装一个。感觉有更高的自定义性吧。(我是初学者,请大佬爱护,勿喷) 一、封装代码:利用UIScrollView的分类实现

#import 
NS_ASSUME_NONNULL_BEGIN@interface UIScrollView (WD_NoData)// 需要显示的占位页面@property (nonatomic, strong) UIView *noDataView;@endNS_ASSUME_NONNULL_END复制代码

实现代码

#import "UIScrollView+WD_NoData.h"#import 
static char *noDataViewKey = "noDataViewKey";@implementation UIScrollView (WD_NoData)/** 交换方法 @param sel1 原方法 @param sel2 自定义方法 @param cls 类 */void exchangeSelector(SEL sel1, SEL sel2, Class cls) { Class class = [cls class]; Method originalMethod = class_getInstanceMethod(class, sel1); Method swizzledMethod = class_getInstanceMethod(class, sel2); BOOL success = class_addMethod(class, sel1, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (success) { class_replaceMethod(class, sel2, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); }}#pragma mark =============== Setter ===============- (void)setNoDataView:(UIView *)noDataView { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ exchangeSelector(@selector(reloadData), @selector(wd_reloadData), [self class]); }); objc_setAssociatedObject(self, noDataViewKey, noDataView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}#pragma mark =============== Getter ===============- (UIView *)noDataView { UIView *noDataView = objc_getAssociatedObject(self, noDataViewKey); noDataView.frame = self.frame; return noDataView;}- (void)wd_reloadData { [self wd_reloadData]; [self wd_checkData];}#pragma mark =============== 获取数据 ===============- (void)wd_checkData { NSInteger items = 0; if (![self respondsToSelector:@selector(dataSource)]) { return; } // UITableView support if ([self isKindOfClass:[UITableView class]]) { UITableView *tableView = (UITableView *)self; id
dataSource = tableView.dataSource; NSInteger sections = 1; if (dataSource && [dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)]) { sections = [dataSource numberOfSectionsInTableView:tableView]; } if (dataSource && [dataSource respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) { for (NSInteger section = 0; section < sections; section++) { items += [dataSource tableView:tableView numberOfRowsInSection:section]; } } } // UICollectionView support else if ([self isKindOfClass:[UICollectionView class]]) { UICollectionView *collectionView = (UICollectionView *)self; id
dataSource = collectionView.dataSource; NSInteger sections = 1; if (dataSource && [dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]) { sections = [dataSource numberOfSectionsInCollectionView:collectionView]; } if (dataSource && [dataSource respondsToSelector:@selector(collectionView:numberOfItemsInSection:)]) { for (NSInteger section = 0; section < sections; section++) { items += [dataSource collectionView:collectionView numberOfItemsInSection:section]; } } } if ( items == 0 ) { [self.superview addSubview:self.noDataView]; } else { [self.noDataView removeFromSuperview]; }}@end复制代码

二、使用方法

#import "UIScrollView+WD_NoData.h"// 自定义页面#import "WDTestEmptyView.h"复制代码
//示例的视图 WDTestEmptyView *view = [NSBundle.mainBundle loadNibNamed:@"WDTestEmptyView" owner:self options:nil].firstObject;// 设置视图self.tableView.noDataView = view;复制代码

三、效果图

转载于:https://juejin.im/post/5c7e2da2f265da2db279572f

你可能感兴趣的文章
【云计算】Docker 多进程管理方案
查看>>
C/C++中经常使用的字符串处理函数和内存字符串函数
查看>>
[LeetCode] Best Meeting Point 最佳开会地点
查看>>
基于InstallShield2013LimitedEdition的安装包制作
查看>>
【转】从Shell脚本内部将所有标准输出及标准错误显示在屏幕并同时写入文件的方法...
查看>>
python内存管理
查看>>
iOS开发小技巧--利用MJExtension解决数据结构复杂的模型转换
查看>>
Python中的图形库
查看>>
Linux操作系统分析 ------------------中国科技大学
查看>>
Apache多站点实现原理和配置
查看>>
javascript类型系统——包装对象
查看>>
Android4.4中不能发送SD卡就绪广播
查看>>
解决:sudo: 无法解析主机:dinphy-500-310cn: 连接超时
查看>>
Asp.Net多线程用法1
查看>>
exFAT是支持Mac和Win的
查看>>
(转)postman中 form-data、x-www-form-urlencoded、raw、binary的区别
查看>>
js Date操作
查看>>
判断用户密码是否在警告期内(学习练习)
查看>>
sp_executesql的执行计划会被重用(转载)
查看>>
禅道项目管理软件插件开发
查看>>