MJTableViewController.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. // 代码地址: https://github.com/CoderMJLee/MJRefresh
  2. // 代码地址: 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
  3. // MJTableViewController.m
  4. // MJRefreshExample
  5. //
  6. // Created by MJ Lee on 15/3/4.
  7. // Copyright (c) 2015年 小码哥. All rights reserved.
  8. //
  9. #import "MJTableViewController.h"
  10. #import "UIView+MJExtension.h"
  11. #import "MJTestViewController.h"
  12. #import "UIViewController+Example.h"
  13. #import "MJRefresh.h"
  14. // 自定义的header
  15. #import "MJChiBaoZiHeader.h"
  16. #import "MJChiBaoZiFooter.h"
  17. #import "MJChiBaoZiFooter2.h"
  18. #import "MJDIYHeader.h"
  19. #import "MJDIYAutoFooter.h"
  20. #import "MJDIYBackFooter.h"
  21. static const CGFloat MJDuration = 2.0;
  22. /**
  23. * 随机数据
  24. */
  25. #define MJRandomData [NSString stringWithFormat:@"随机数据---%d", arc4random_uniform(1000000)]
  26. @interface MJTableViewController()
  27. /** 用来显示的假数据 */
  28. @property (strong, nonatomic) NSMutableArray *data;
  29. @end
  30. @implementation MJTableViewController
  31. #pragma mark - 示例代码
  32. #pragma mark UITableView + 下拉刷新 默认
  33. - (void)example01
  34. {
  35. __weak __typeof(self) weakSelf = self;
  36. // 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
  37. self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
  38. [weakSelf loadNewData];
  39. }];
  40. // 马上进入刷新状态
  41. [self.tableView.header beginRefreshing];
  42. }
  43. #pragma mark UITableView + 下拉刷新 动画图片
  44. - (void)example02
  45. {
  46. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
  47. self.tableView.header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
  48. // 马上进入刷新状态
  49. [self.tableView.header beginRefreshing];
  50. }
  51. #pragma mark UITableView + 下拉刷新 隐藏时间
  52. - (void)example03
  53. {
  54. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
  55. MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
  56. // 设置自动切换透明度(在导航栏下面自动隐藏)
  57. header.autoChangeAlpha = YES;
  58. // 隐藏时间
  59. header.lastUpdatedTimeLabel.hidden = YES;
  60. // 马上进入刷新状态
  61. [header beginRefreshing];
  62. // 设置header
  63. self.tableView.header = header;
  64. }
  65. #pragma mark UITableView + 下拉刷新 隐藏状态和时间
  66. - (void)example04
  67. {
  68. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
  69. MJChiBaoZiHeader *header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
  70. // 隐藏时间
  71. header.lastUpdatedTimeLabel.hidden = YES;
  72. // 隐藏状态
  73. header.stateLabel.hidden = YES;
  74. // 马上进入刷新状态
  75. [header beginRefreshing];
  76. // 设置header
  77. self.tableView.header = header;
  78. }
  79. #pragma mark UITableView + 下拉刷新 自定义文字
  80. - (void)example05
  81. {
  82. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
  83. MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
  84. // 设置文字
  85. [header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
  86. [header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
  87. [header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
  88. // 设置字体
  89. header.stateLabel.font = [UIFont systemFontOfSize:15];
  90. header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
  91. // 设置颜色
  92. header.stateLabel.textColor = [UIColor redColor];
  93. header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
  94. // 马上进入刷新状态
  95. [header beginRefreshing];
  96. // 设置刷新控件
  97. self.tableView.header = header;
  98. }
  99. #pragma mark UITableView + 下拉刷新 自定义刷新控件
  100. - (void)example06
  101. {
  102. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
  103. self.tableView.header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
  104. [self.tableView.header beginRefreshing];
  105. }
  106. #pragma mark UITableView + 上拉刷新 默认
  107. - (void)example11
  108. {
  109. __weak __typeof(self) weakSelf = self;
  110. // 设置回调(一旦进入刷新状态就会调用这个refreshingBlock)
  111. self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
  112. [weakSelf loadMoreData];
  113. }];
  114. }
  115. #pragma mark UITableView + 上拉刷新 动画图片
  116. - (void)example12
  117. {
  118. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  119. self.tableView.footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  120. }
  121. #pragma mark UITableView + 上拉刷新 隐藏刷新状态的文字
  122. - (void)example13
  123. {
  124. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  125. MJChiBaoZiFooter *footer = [MJChiBaoZiFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  126. // 当上拉刷新控件出现50%时(出现一半),就会自动刷新。这个值默认是1.0(也就是上拉刷新100%出现时,才会自动刷新)
  127. // footer.appearencePercentTriggerAutoRefresh = 0.5;
  128. // 隐藏刷新状态的文字
  129. footer.refreshingTitleHidden = YES;
  130. // 设置footer
  131. self.tableView.footer = footer;
  132. }
  133. #pragma mark UITableView + 上拉刷新 全部加载完毕
  134. - (void)example14
  135. {
  136. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadLastData方法)
  137. self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadLastData)];
  138. // 其他
  139. self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"恢复数据加载" style:UIBarButtonItemStyleDone target:self action:@selector(reset)];
  140. }
  141. - (void)reset
  142. {
  143. [self.tableView.footer setRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  144. // [self.tableView.footer beginRefreshing];
  145. [self.tableView.footer resetNoMoreData];
  146. }
  147. #pragma mark UITableView + 上拉刷新 禁止自动加载
  148. - (void)example15
  149. {
  150. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  151. MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  152. // 禁止自动加载
  153. footer.automaticallyRefresh = NO;
  154. // 设置footer
  155. self.tableView.footer = footer;
  156. }
  157. #pragma mark UITableView + 上拉刷新 自定义文字
  158. - (void)example16
  159. {
  160. // 添加默认的上拉刷新
  161. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  162. MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  163. // 设置文字
  164. [footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
  165. [footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
  166. [footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];
  167. // 设置字体
  168. footer.stateLabel.font = [UIFont systemFontOfSize:17];
  169. // 设置颜色
  170. footer.stateLabel.textColor = [UIColor blueColor];
  171. // 设置footer
  172. self.tableView.footer = footer;
  173. }
  174. #pragma mark UITableView + 上拉刷新 加载后隐藏
  175. - (void)example17
  176. {
  177. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadOnceData方法)
  178. self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadOnceData)];
  179. }
  180. #pragma mark UITableView + 上拉刷新 自动回弹的上拉01
  181. - (void)example18
  182. {
  183. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  184. self.tableView.footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  185. }
  186. #pragma mark UITableView + 上拉刷新 自动回弹的上拉02
  187. - (void)example19
  188. {
  189. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadLastData方法)
  190. self.tableView.footer = [MJChiBaoZiFooter2 footerWithRefreshingTarget:self refreshingAction:@selector(loadLastData)];
  191. }
  192. #pragma mark UITableView + 上拉刷新 自定义刷新控件(自动刷新)
  193. - (void)example20
  194. {
  195. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  196. self.tableView.footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  197. }
  198. #pragma mark UITableView + 上拉刷新 自定义刷新控件(自动回弹)
  199. - (void)example21
  200. {
  201. // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
  202. self.tableView.footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
  203. }
  204. #pragma mark - 数据处理相关
  205. #pragma mark 下拉刷新数据
  206. - (void)loadNewData
  207. {
  208. // 1.添加假数据
  209. for (int i = 0; i<5; i++) {
  210. [self.data insertObject:MJRandomData atIndex:0];
  211. }
  212. // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
  213. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  214. // 刷新表格
  215. [self.tableView reloadData];
  216. // 拿到当前的下拉刷新控件,结束刷新状态
  217. [self.tableView.header endRefreshing];
  218. });
  219. }
  220. #pragma mark 上拉加载更多数据
  221. - (void)loadMoreData
  222. {
  223. // 1.添加假数据
  224. for (int i = 0; i<5; i++) {
  225. [self.data addObject:MJRandomData];
  226. }
  227. // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
  228. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  229. // 刷新表格
  230. [self.tableView reloadData];
  231. // 拿到当前的上拉刷新控件,结束刷新状态
  232. [self.tableView.footer endRefreshing];
  233. });
  234. }
  235. #pragma mark 加载最后一份数据
  236. - (void)loadLastData
  237. {
  238. // 1.添加假数据
  239. for (int i = 0; i<5; i++) {
  240. [self.data addObject:MJRandomData];
  241. }
  242. // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
  243. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  244. // 刷新表格
  245. [self.tableView reloadData];
  246. // 拿到当前的上拉刷新控件,变为没有更多数据的状态
  247. [self.tableView.footer noticeNoMoreData];
  248. });
  249. }
  250. #pragma mark 只加载一次数据
  251. - (void)loadOnceData
  252. {
  253. // 1.添加假数据
  254. for (int i = 0; i<5; i++) {
  255. [self.data addObject:MJRandomData];
  256. }
  257. // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
  258. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  259. // 刷新表格
  260. [self.tableView reloadData];
  261. // 隐藏当前的上拉刷新控件
  262. self.tableView.footer.hidden = YES;
  263. });
  264. }
  265. - (NSMutableArray *)data
  266. {
  267. if (!_data) {
  268. self.data = [NSMutableArray array];
  269. }
  270. return _data;
  271. }
  272. #pragma mark - 其他
  273. - (void)viewDidLoad
  274. {
  275. [super viewDidLoad];
  276. self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  277. #pragma clang diagnostic push
  278. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  279. [self performSelector:NSSelectorFromString(self.method) withObject:nil];
  280. #pragma clang diagnostic pop
  281. [self.tableView registerNib:[UINib nibWithNibName:@"MJTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];
  282. }
  283. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  284. {
  285. return self.data.count;
  286. }
  287. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  288. {
  289. static NSString *ID = @"cell";
  290. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  291. if (cell == nil) {
  292. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
  293. }
  294. cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", indexPath.row % 2?@"push":@"modal", self.data[indexPath.row]];
  295. return cell;
  296. }
  297. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  298. {
  299. MJTestViewController *test = [[MJTestViewController alloc] init];
  300. if (indexPath.row % 2) {
  301. [self.navigationController pushViewController:test animated:YES];
  302. } else {
  303. UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:test];
  304. [self presentViewController:nav animated:YES completion:nil];
  305. }
  306. }
  307. @end