| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- // 代码地址: https://github.com/CoderMJLee/MJRefresh
- // 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000
- // MJTableViewController.m
- // MJRefreshExample
- //
- // Created by MJ Lee on 15/3/4.
- // Copyright (c) 2015年 小码哥. All rights reserved.
- //
- #import "MJTableViewController.h"
- #import "UIView+MJExtension.h"
- #import "MJTestViewController.h"
- #import "UIViewController+Example.h"
- #import "MJRefresh.h"
- // 自定义的header
- #import "MJChiBaoZiHeader.h"
- #import "MJChiBaoZiFooter.h"
- #import "MJChiBaoZiFooter2.h"
- #import "MJDIYHeader.h"
- #import "MJDIYAutoFooter.h"
- #import "MJDIYBackFooter.h"
- static const CGFloat MJDuration = 2.0;
- /**
- * 随机数据
- */
- #define MJRandomData [NSString stringWithFormat:@"随机数据---%d", arc4random_uniform(1000000)]
- @interface MJTableViewController()
- /** 用来显示的假数据 */
- @property (strong, nonatomic) NSMutableArray *data;
- @end
- @implementation MJTableViewController
- #pragma mark - 示例代码
- #pragma mark UITableView + 下拉刷新 默认
- - (void)example01
- {
- __weak __typeof(self) weakSelf = self;
-
- // 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
- self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
- [weakSelf loadNewData];
- }];
-
- // 马上进入刷新状态
- [self.tableView.mj_header beginRefreshing];
- }
- #pragma mark UITableView + 下拉刷新 动画图片
- - (void)example02
- {
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
- self.tableView.mj_header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
-
- // 马上进入刷新状态
- [self.tableView.mj_header beginRefreshing];
- }
- #pragma mark UITableView + 下拉刷新 隐藏时间
- - (void)example03
- {
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
- MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
-
- // 设置自动切换透明度(在导航栏下面自动隐藏)
- header.automaticallyChangeAlpha = YES;
-
- // 隐藏时间
- header.lastUpdatedTimeLabel.hidden = YES;
-
- // 马上进入刷新状态
- [header beginRefreshing];
-
- // 设置header
- self.tableView.mj_header = header;
- }
- #pragma mark UITableView + 下拉刷新 隐藏状态和时间
- - (void)example04
- {
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
- MJChiBaoZiHeader *header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
-
- // 隐藏时间
- header.lastUpdatedTimeLabel.hidden = YES;
- // 隐藏状态
- header.stateLabel.hidden = YES;
-
- // 马上进入刷新状态
- [header beginRefreshing];
-
- // 设置header
- self.tableView.mj_header = header;
- }
- #pragma mark UITableView + 下拉刷新 自定义文字
- - (void)example05
- {
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
- MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
-
- // 设置文字
- [header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
- [header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
- [header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
-
- // 设置字体
- header.stateLabel.font = [UIFont systemFontOfSize:15];
- header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
- // 设置颜色
- header.stateLabel.textColor = [UIColor redColor];
- header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
-
- // 马上进入刷新状态
- [header beginRefreshing];
-
- // 设置刷新控件
- self.tableView.mj_header = header;
- }
- #pragma mark UITableView + 下拉刷新 自定义刷新控件
- - (void)example06
- {
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
- self.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
- [self.tableView.mj_header beginRefreshing];
- }
- #pragma mark UITableView + 上拉刷新 默认
- - (void)example11
- {
- [self example01];
-
- __weak __typeof(self) weakSelf = self;
-
- // 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
- self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
- [weakSelf loadMoreData];
- }];
- // ((MJRefreshAutoFooter *)self.tableView.mj_footer).onlyRefreshPerDrag = YES;
- }
- #pragma mark UITableView + 上拉刷新 动画图片
- - (void)example12
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- self.tableView.mj_footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- }
- #pragma mark UITableView + 上拉刷新 隐藏刷新状态的文字
- - (void)example13
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- MJChiBaoZiFooter *footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
-
- // 当上拉刷新控件出现50%时(出现一半),就会自动刷新。这个值默认是1.0(也就是上拉刷新100%出现时,才会自动刷新)
- // footer.triggerAutomaticallyRefreshPercent = 0.5;
-
- // 隐藏刷新状态的文字
- footer.refreshingTitleHidden = YES;
-
- // 设置footer
- self.tableView.mj_footer = footer;
- }
- #pragma mark UITableView + 上拉刷新 全部加载完毕
- - (void)example14
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadLastData方法)
- self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadLastData)];
-
- // 其他
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"恢复数据加载" style:UIBarButtonItemStyleDone target:self action:@selector(reset)];
- }
- - (void)reset
- {
- [self.tableView.mj_footer setRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- [self.tableView.mj_footer resetNoMoreData];
- }
- #pragma mark UITableView + 上拉刷新 禁止自动加载
- - (void)example15
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
-
- // 禁止自动加载
- footer.automaticallyRefresh = NO;
-
- // 设置footer
- self.tableView.mj_footer = footer;
- }
- #pragma mark UITableView + 上拉刷新 自定义文字
- - (void)example16
- {
- [self example01];
-
- // 添加默认的上拉刷新
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
-
- // 设置文字
- [footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
- [footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
- [footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];
- // 设置字体
- footer.stateLabel.font = [UIFont systemFontOfSize:17];
- // 设置颜色
- footer.stateLabel.textColor = [UIColor blueColor];
-
- // 设置footer
- self.tableView.mj_footer = footer;
- }
- #pragma mark UITableView + 上拉刷新 加载后隐藏
- - (void)example17
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadOnceData方法)
- self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadOnceData)];
- }
- #pragma mark UITableView + 上拉刷新 自动回弹的上拉01
- - (void)example18
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- // 设置了底部inset
- self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 30, 0);
- // 忽略掉底部inset
- self.tableView.mj_footer.ignoredScrollViewContentInsetBottom = 30;
- }
- #pragma mark UITableView + 上拉刷新 自动回弹的上拉02
- - (void)example19
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadLastData方法)
- self.tableView.mj_footer = [MJChiBaoZiFooter2 footerWithRefreshingTarget:self refreshingAction:@selector(loadLastData)];
- self.tableView.mj_footer.automaticallyChangeAlpha = YES;
- }
- #pragma mark UITableView + 上拉刷新 自定义刷新控件(自动刷新)
- - (void)example20
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- }
- #pragma mark UITableView + 上拉刷新 自定义刷新控件(自动回弹)
- - (void)example21
- {
- [self example01];
-
- // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
- self.tableView.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
- }
- #pragma mark - 数据处理相关
- #pragma mark 下拉刷新数据
- - (void)loadNewData
- {
- // 1.添加假数据
- for (int i = 0; i<5; i++) {
- [self.data insertObject:MJRandomData atIndex:0];
- }
-
- // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
- __weak UITableView *tableView = self.tableView;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 刷新表格
- [tableView reloadData];
-
- // 拿到当前的下拉刷新控件,结束刷新状态
- [tableView.mj_header endRefreshing];
- });
- }
- #pragma mark 上拉加载更多数据
- - (void)loadMoreData
- {
- // 1.添加假数据
- for (int i = 0; i<5; i++) {
- [self.data addObject:MJRandomData];
- }
-
- // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
- __weak UITableView *tableView = self.tableView;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 刷新表格
- [tableView reloadData];
-
- // 拿到当前的上拉刷新控件,结束刷新状态
- [tableView.mj_footer endRefreshing];
- });
- }
- #pragma mark 加载最后一份数据
- - (void)loadLastData
- {
- // 1.添加假数据
- for (int i = 0; i<5; i++) {
- [self.data addObject:MJRandomData];
- }
-
- // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
- __weak UITableView *tableView = self.tableView;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 刷新表格
- [tableView reloadData];
-
- // 拿到当前的上拉刷新控件,变为没有更多数据的状态
- [tableView.mj_footer endRefreshingWithNoMoreData];
- });
- }
- #pragma mark 只加载一次数据
- - (void)loadOnceData
- {
- // 1.添加假数据
- for (int i = 0; i<5; i++) {
- [self.data addObject:MJRandomData];
- }
-
- // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
- __weak UITableView *tableView = self.tableView;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 刷新表格
- [tableView reloadData];
-
- // 隐藏当前的上拉刷新控件
- tableView.mj_footer.hidden = YES;
- });
- }
- - (NSMutableArray *)data
- {
- if (!_data) {
- self.data = [NSMutableArray array];
- for (int i = 0; i<5; i++) {
- [self.data addObject:MJRandomData];
- }
- }
- return _data;
- }
- #pragma mark - 其他
- - (void)viewDidLoad
- {
- [super viewDidLoad];
-
- self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
- MJPerformSelectorLeakWarning(
- [self performSelector:NSSelectorFromString(self.method) withObject:nil];
- );
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return self.data.count;
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- static NSString *ID = @"cell";
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
- if (cell == nil) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
- }
-
- cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", indexPath.row % 2?@"push":@"modal", self.data[indexPath.row]];
-
- return cell;
- }
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- MJTestViewController *test = [[MJTestViewController alloc] init];
- if (indexPath.row % 2) {
- [self.navigationController pushViewController:test animated:YES];
- } else {
- UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:test];
- [self presentViewController:nav animated:YES completion:nil];
- }
- }
- @end
|