iOS中許多頁面都是tableView耳鸯,而不少tableView都需要提供下拉刷新、上拉加載等功能膀曾。MJRefresh和SVPullToRefresh是兩個很好的第三方刷新控件县爬。這里大概寫一下自己利用SVPullToRefresh實現(xiàn)下拉刷新、上拉加載功能步驟添谊。
- 創(chuàng)建tableView
- (CardTableView *)tableView
{
if (!_tableView) {
_tableView = [[CardTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_tableView.backgroundColor = [UIColor whiteColor];
_tableView.clickCellDelegate = self;
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
_tableView.scrollIndicatorInsets = UIEdgeInsetsMake(64, 0, 0, 0);
}
return _tableView;
}
PS: 當你導航欄為半透明模糊風格時财喳,contentInset和scrollIndicatorInsets屬性你可能用的到
- viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.title = @"帖子";
self.view.backgroundColor = [UIColor whiteColor];
self.automaticallyAdjustsScrollViewInsets = NO;//取消自動偏移
self.loadMoreIndex = 0;
self.isFirstLoad = YES;
[self setupUI];//布局tableView方法
[self setupErrorUI];//布局錯誤頁面方法
[self contentRefresh];//下拉刷新方法
[self contentLoadMore];//上拉加載方法
[self firstLoadData];//首次加載數(shù)據(jù)方法
}
#pragma mark -首次加載數(shù)據(jù)
- (void)firstLoadData
{
self.currentIndex = 1;
[self requestMyCardListData];
}
#pragma mark -下拉刷新
- (void)contentRefresh
{
__weak typeof(self) weakSelf = self;
[self.tableView addPullToRefreshWithActionHandler:^{
__strong typeof(weakSelf) sself = weakSelf;
sself.loadMoreIndex = 0;
sself.currentIndex = 1;
[sself requestMyCardListData];
}];
}
#pragma mark -上拉加載
- (void)contentLoadMore
{
__weak typeof(self) weakSelf = self;
[self.tableView addInfiniteScrollingWithActionHandler:^{
__strong typeof(weakSelf) sself = weakSelf;
sself.loadMoreIndex ++;
[sself requestMyCardListData];
}];
}
//tableView約束
[self.view addSubview:self.tableView];
[_tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.and.trailing.equalTo(@0);
make.top.equalTo(self.mas_topLayoutGuideTop);
make.bottom.equalTo(self.mas_bottomLayoutGuideTop);
}];
- 數(shù)據(jù): 這里模擬網(wǎng)絡(luò)請求
- (void)requestMyCardListData
{
//模擬網(wǎng)路請求
MBProgressHUD *hud;
if (self.isFirstLoad) {
hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
}
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) sself = weakSelf;
if (sself.isFirstLoad) {
[hud hideAnimated:YES];
}
BOOL isSuccess = YES;
if (isSuccess) {//請求成功
sself.isFirstLoad = NO;
if (sself.currentIndex == 1) {//下拉
[sself.dataArray removeAllObjects];
sself.tableView.showsInfiniteScrolling = YES;
}
sself.currentIndex += 1;
NSInteger dataNum = 10;
if (sself.loadMoreIndex == 2) {
dataNum = 3;
}
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < dataNum; i ++) {
CardModel *model = [[CardModel alloc] init];
model.cardContent = [NSString stringWithFormat:@"內(nèi)容%d", i];
model.color = i;
model.day = i + 2;
model.month = i + 1;
[array addObject:model];
}
[sself.dataArray addObjectsFromArray:array];
sself.tableView.dataArray = sself.dataArray;
[sself.tableView reloadData];
if (sself.dataArray.count == 0) {
sself.myErrorView.hidden = NO;
sself.tableView.hidden = YES;
sself.myErrorView.userInteractionEnabled = NO;
sself.myErrorLabel.text = @"還沒有發(fā)帖哦!";
sself.myErrorBotLabel.hidden = YES;
}else {
sself.myErrorView.hidden = YES;
sself.tableView.hidden = NO;
}
if (array.count < kPageSize) {//數(shù)據(jù)不足一頁時 不顯示上拉控件
sself.tableView.showsInfiniteScrolling = NO;
}
}else {//error
if (sself.dataArray.count > 0) {//如果已經(jīng)有數(shù)據(jù) 錯誤提示
sself.myErrorView.hidden = YES;
sself.tableView.hidden = NO;
//提示
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:sself.view animated:YES];
[hud hideAnimated:YES afterDelay:2];
}else {//沒數(shù)據(jù) 錯誤頁面 -點擊重試
sself.myErrorView.hidden = NO;
sself.tableView.hidden = YES;
sself.myErrorView.userInteractionEnabled = YES;
sself.myErrorLabel.text = @"頁面加載失敗";
sself.myErrorBotLabel.hidden = NO;
}
}
[sself.tableView.pullToRefreshView stopAnimating];
[sself.tableView.infiniteScrollingView stopAnimating];
});
}
PS: 每次下拉 成功回調(diào)顯示上拉加載控件(因為暫時不知是否還有數(shù)據(jù)), 頁碼增加: sself.currentIndex += 1; 判斷每次加載得到的數(shù)據(jù)是否夠一頁的數(shù)據(jù),若不足一頁數(shù)據(jù)則說明數(shù)據(jù)加載完畢斩狱,不顯示上拉控件纲缓;最后 結(jié)束下拉或上拉
另外,需要注意的是喊废,需要先reload 然后再隱藏上拉加載控件祝高,否則上拉成功后, 頁面會向下滑動一定距離污筷,新加載出來的數(shù)據(jù)不顯示在可視頁面上工闺,需要手動上拉才顯示
即:
[sself.tableView reloadData];//reloadData在tableView.showsInfiniteScrolling前面執(zhí)行
sself.tableView.showsInfiniteScrolling = NO;
若reloadData在隱藏上拉加載控件后執(zhí)行效果:
當?shù)诙紊侠瓟?shù)據(jù)成功后 頁面向下滑動了一段距離 新加載的數(shù)據(jù)未顯示在可視頁面上
先reloadData然后隱藏上拉控件: