默认情况下,如果你的表视图是空的,屏幕上什么也不会显示,就是一片空白,它给用户的体验不是很好,于是DZNEmptyDataSet出现了(github.com/dzenbot/DZNEmptyDataSet v1.8.1)。
正当我开开心心的接入了这个库以后,被产品告知在此界面下也要支持下拉刷新。。。
于是我就去看了下源码,这篇文章重点不是对DZNEmptyDataSet的详细解析,而是从这个源码得到的收获。
客观的说,跟那些动不动几十个类的第三方库相比,这个库还是比较简单的。首先运用runtime给UIScrollView的分类绑定属性emptyDataSetSource和emptyDataSetDelegate,这个方法很多第三方库都会使用。
这个库的原理是给UIScrollView写了个分类EmptyDataSet。它的实现主要是通过4个类来完成,DZNWeakObjectContainer,DZNConstraintBasedLayoutExtensions,DZNEmptyDataSetView,EmptyDataSet。其中DZNEmptyDataSetView,EmptyDataSet是重点。收获就是以后实现功能时可以在一个.m文件中构建多个类,每个类封装单独的功能,使逻辑结构清晰合理。这个类的关键方法是- (void)dzn_reloadEmptyDataSet,这个类通过runtime往特定的UITableView和UICollectionView的reloadData方法实现中注入了dzn_reloadEmptyDataSet,在原本的reloadData之前调用了dzn_reloadEmptyDataSet。亮点是运用可变字典_impLookupTable储存已经注入过的方法,防止重复注入出现bug。
补上DZNEmptyDataSet支持下拉刷新的代码
1.首先是
#pragma mark - DZNEmptyDataSetDelegate
- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView
{
return YES;
}
2.然后是
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
UIView *firstView = scrollView.subviews[0];
if ([firstView isKindOfClass:NSClassFromString(@"DZNEmptyDataSetView")]) {
/*
发送网络请求的代码(略)
*/
// 显示菊花,类似于mjrefresh的下拉刷新效果。
self.activityIndicatorView.centerY = 100;
[self.activityIndicatorView startAnimating];
}
}
先将就着看,有空我改成markdown排版