结合MJRefresh与LYEmptyView,优雅地显示emptyView。
Display emptyView easily with MJRefresh and LYEmptyView.
LYEmptyView实现了在tableView刷新时自动切换emptyView的显示隐藏,本文结合MJRefresh与LYEmptyView,实现了在MJRefresh刷新后,自动显示/隐藏emptyView的需求,同时,针对部分同学第一次进入页面时需要隐藏emptyView的需求也做了适配。
或者直接使用源码:MJRefresh,LYEmptyView,EasyEmptyTableView
#import <MJRefresh/MJRefresh.h>
#import <LYEmptyView/LYEmptyViewHeader.h>
#import "EasyEmptyTableView.h"
注意请在tableView初始化之后调用
- (void)setUpEasyEmptyView{
/**
分以下情况:
一:
自动显示emptyView,直接引用本库,并初始化即可
解释:因为LYEmptyView默认配置就是自动显示/隐藏
二:
第一次不显示emptyView,之后自动显示/隐藏,设置ly_emptyView.autoShowEmptyView = NO,并初始化即可
解释:第一次刷新数据之后,在MJRefreshComponent+Switch.h中,依据haveBeenInBefore属性更新了autoShowEmptyView=yes,之后就是ly_emptyView控制自动显示/隐藏
*/
[self.tableView setUpEmptyView];
//如果第一次需要隐藏,请加上以下三行代码
if (_showEmptyViewAtFirstIn == NO) {
self.tableView.ly_emptyView.autoShowEmptyView = NO;
}
//add header
__weak typeof(self) wlf = self;
//mj_header开始刷新时会调用beginRefreshing
//beginRefreshing通过方法交换,调用ly_startLoading
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[wlf setUpData];
}];
self.tableView.ly_emptyView.tapContentViewBlock = ^{
[wlf headerRefresh];
};
}
//交换MJRefreshComponent的方法是因为,footer与header都是继承于此类
//所以不论是footer还是header,都会在结束刷新后正确的显示/隐藏emptyView
+ (void)load{
Method m1, m2;
m1 = class_getInstanceMethod(self, @selector(beginRefreshing));
m2 = class_getInstanceMethod(self, @selector(customBeginRefreshing));
method_exchangeImplementations(m1, m2);
m1 = class_getInstanceMethod(self, @selector(endRefreshing));
m2 = class_getInstanceMethod(self, @selector(customEndRefreshing));
method_exchangeImplementations(m1, m2);
}
- (void)customBeginRefreshing{
[self customBeginRefreshing];
//如果是第一次进入,执行ly_startLoading
if (self.scrollView.haveBeenInBefore==NO) {
[self.scrollView ly_startLoading];
//将view的haveBeenInBefore属性设置为YES
self.scrollView.haveBeenInBefore = YES;
} else { //如果不是第一次进入,打开emptyView的autoShowEmptyView
self.scrollView.ly_emptyView.autoShowEmptyView = YES;
}
}
- (void)customEndRefreshing{
[self customEndRefreshing];
[self.scrollView ly_endLoading];
}
static NSString* const haveBeenInBeforeKey = @"haveBeenInBeforeKey";
@implementation UIView (FirstIn)
- (void)setHaveBeenInBefore:(BOOL)haveBeenInBefore{
objc_setAssociatedObject(self, &haveBeenInBeforeKey, @(haveBeenInBefore), OBJC_ASSOCIATION_ASSIGN);
}
- (BOOL)haveBeenInBefore{
return [objc_getAssociatedObject(self, &haveBeenInBeforeKey) boolValue];
}
- (void)setUpEmptyView{
LYEmptyView *emptyV = [LYEmptyView emptyViewWithImage:[UIImage imageNamed:@"EasyEmptyTableView.bundle/empty_page"] titleStr:@"暂无数据,点击重试" detailStr:nil];
self.ly_emptyView = emptyV;
}
//mj_header开始刷新时会调用beginRefreshing
//beginRefreshing通过方法交换,调用ly_startLoading
[self.tableView.mj_header beginRefreshing];
[self.tableView reloadData];
//注意要在reloadData之后调用endRefreshing
//endRefreshing通过方法交换,调用ly_endLoading
[self.tableView.mj_header endRefreshing];