DZNEmptyDataSet

默认情况下,如果你的表视图是空的,屏幕上什么也不会显示,就是一片空白,它给用户的体验不是很好,于是DZNEmptyDataSet出现了(github.com/dzenbot/DZNEmptyDataSet    v1.8.1)。

正当我开开心心的接入了这个库以后,被产品告知在此界面下也要支持下拉刷新。。。

DZNEmptyDataSet_第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_第2张图片

补上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排版

你可能感兴趣的:(DZNEmptyDataSet)