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

本文共 3835 字,大约阅读时间需要 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;复制代码

三、效果图

转载地址:http://yfmja.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2017 15.5预览版添加对F# Core及Standard的支持
查看>>
系统监控:top vs Htop vs Glances
查看>>
通过调研开源基准测试集,解读大数据的应用现状和开源未来
查看>>
期待已久的Firefox 39最终顺利发布
查看>>
VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
查看>>
如何通俗易懂地向别人解释React生命周期方法?
查看>>
马化腾:电力时代孕育了计算机,人工智能兴盛于云计算
查看>>
esp8266代码中的存储标记
查看>>
如何在C++中使用空引用及该或不该
查看>>
进击JavaScript之(三)玩转闭包
查看>>
js面试
查看>>
AngularJS指令实践
查看>>
Python工具分析风险数据
查看>>
Git自由之章 - 关于SSH 公钥
查看>>
关于classpath中有多个同名类或一个接口有多个实现类Spring启动失败总结
查看>>
数组reduce方法的高级技巧
查看>>
pt-online-schema-change使用说明、限制与比较
查看>>
一些小技巧让JS代码更优雅
查看>>
jquery 添加和删除html元素
查看>>
Java 8怎么了之二:函数和原语
查看>>