iOS UITableView下拉刷新上拉加载更多MJRefresh类库(推荐)使用初级剑侠篇(欢迎提建议和分享遇到的问题)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012113447/article/details/41678701


注意这个下载一定要到github上下载,不要到code4app上下载然后用里面的库文件,我在code4app上下载 缺少文件:MJRefreshBaseViewDelegate

github下载地址:

https://github.com/151283250/MJRefresh/blob/master/MJRefresh.h


有疑问和建议请评论,先谢谢了。


@导入类

1.将MJRefresh文件夹整个导入所需的工程中。(支持ARC,MRC工程要注意设置)

2.文件夹中的MJRefresh.bundle—>arrow@2x.png 图片可自行替换,这个会在刷新过程中显示。

3.可以在MJRefreshConst.h和MJRefreshConst.m文件中自定义显示的文字内容和文字颜色。

4.只要你的view能够滚动,就能集成这个控件,比如UIScrollView、UITableView、UICollectionView

5  导入头文件   #import "MJRefresh.h"


@实现

     MJ大神提供了代理协议方法<MJRefreshBaseViewDelegate>和Block方法,大家随便选一种实现就行

下面给出代理协议方法实现的主要代码:

      主要实现:上拉加载10条新闻,每次都是显示在最前面;下拉加载10条新闻,每次都是显示在已有新闻下面

      @自动刷新:调用beginRefreshing可以自动进入下拉刷新状态

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #import "NewsListViewController.h"  
  2. #import "HMTMyCustomNetRequest.h"  
  3. #import "NewsItem.h"  
  4. #import "MJRefresh.h"  
  5.   
  6. @interface NewsListViewController () <MJRefreshBaseViewDelegate>  
  7. {  
  8.     HMTMyCustomNetRequest * _request;  
  9.     MJRefreshHeaderView * _header;  
  10.     MJRefreshFooterView * _footer;  
  11.   
  12.     NSUInteger number;  
  13.       
  14. }  
  15. @property (nonatomic,retain)NSMutableArray * newDataArray;  
  16. @property (nonatomic,retain)NSMutableArray * oldDataArray;  
  17. @property (nonatomic,copy)NSString * dataString;  
  18.   
  19. @end  
  20.   
  21. @implementation NewsListViewController  
  22. - (void)dealloc  
  23. {  
  24.       
  25.     [_header release];  
  26.     [_footer release];  
  27.       
  28.     RELEASE_SAFELY(_dataString);  
  29.     RELEASE_SAFELY(_newDataArray);  
  30.     RELEASE_SAFELY(_oldDataArray);  
  31.       
  32.     //取消网络请求  
  33.     [_request cancelNSURLConnection];  
  34.     _request = nil;  
  35.       
  36.     [super dealloc];  
  37. }  
  38. - (id)initWithStyle:(UITableViewStyle)style  
  39. {  
  40.     self = [super initWithStyle:style];  
  41.     if (self) {  
  42.         // Custom initialization  
  43.     }  
  44.     return self;  
  45. }  
  46.   
  47. - (void)viewDidLoad  
  48. {  
  49.     [super viewDidLoad];  
  50.       
  51.     number = 0;  
  52.       
  53. #pragma mark 从顶部往下刷新------>下拉刷新  
  54.     _header = [MJRefreshHeaderView header];  
  55.     _header.scrollView = self.tableView;  
  56.     _header.delegate = self;  
  57.       
  58. #pragma mark 从底部往上刷新------>上拉刷新  
  59.     _footer = [MJRefreshFooterView footer];  
  60.     _footer.scrollView = self.tableView;  
  61.     _footer.delegate = self;  
  62.       
  63.     self.newDataArray = [NSMutableArray array];  
  64.     self.oldDataArray = [NSMutableArray array];  
  65.   
  66. }  
  67.   
  68. #pragma mark - 开始刷新  
  69. - (void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView{  
  70.   
  71.     self.dataString = [[NSString stringWithFormat:@"date=20131129&startRecord=%lu",number] stringByAppendingString:@"&len=10&udid=1234567890&terminalType=Iphone&cid=213"];  
  72.       
  73.     _request = [[HMTMyCustomNetRequest alloc] init];  
  74.     NSData * postData = [_dataString dataUsingEncoding:NSUTF8StringEncoding];  
  75.     [_request requestForPOSTWithUrl:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" postData:postData];  
  76.       
  77.     [_request setFinishLoadBlock:^(NSData * data){  
  78.           
  79.         //解析数据  
  80.         NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];  
  81.         NSArray * originalArray = [dic objectForKey:@"news"];  
  82.       
  83.         //将originalArray中的字典,逐个封装为newsItem数据对象,存储在UITableView的数据源中  
  84.         for (int i = 0; i<[originalArray count]; i++) {  
  85.               
  86.             //从解析得到的数组中,获取包含新闻信息的字典对象并把它封装为NewsItem类型的数据对象  
  87.             NewsItem * item = [[NewsItem alloc] initWithDic:[originalArray objectAtIndex:i]];  
  88.               
  89.             //将封装好数据对象item添加到tableView的数据源中  
  90.             [_newDataArray addObject:item];  
  91.             [item release];  
  92.               
  93.         }  
  94.           
  95. #pragma mark 下拉刷新,要的是加载新数据---见网易新闻刷新  
  96.         if ([refreshView isMemberOfClass:[MJRefreshHeaderView class]]) {  
  97.           
  98.             for (int i = 0; i < [_newDataArray count]; i++) {  
  99.                   
  100.                 [self.oldDataArray insertObject:[_newDataArray objectAtIndex:i] atIndex:i];  
  101.                   
  102.             }  
  103.   
  104.             [self.tableView reloadData];  
  105.             // 结束刷新  
  106.             [refreshView endRefreshing];  
  107.            
  108. #pragma mark 上拉加载,要的是加载更多数据---见百度贴吧翻页  
  109.         }else if([refreshView isMemberOfClass:[MJRefreshFooterView class]]){  
  110.           
  111.              
  112.             for (int i = 0; i < [_newDataArray count]; i++) {  
  113.                   
  114.                 [self.oldDataArray addObject:[_newDataArray objectAtIndex:i]];  
  115.                   
  116.             }  
  117.               
  118.             [self.tableView reloadData];  
  119.             // 结束刷新  
  120.             [refreshView endRefreshing];  
  121.   
  122.         }  
  123.           
  124.     }];  
  125.       
  126. }  
  127.   
  128. #pragma mark - 刷新结束时调用的方法  
  129. - (void)refreshViewEndRefreshing:(MJRefreshBaseView *)refreshView{  
  130.   
  131.     // 下拉刷新  
  132.     if ([refreshView isMemberOfClass:[MJRefreshHeaderView class]]) {  
  133.           
  134.         self.newDataArray = [NSMutableArray array];  
  135.         number += 10;  
  136.           
  137.     } else {  
  138.           
  139.         self.newDataArray = [NSMutableArray array];  
  140.         number += 10;  
  141.           
  142.     }  
  143.       
  144. }  
  145.   
  146. #pragma mark - 监测状态  
  147. - (void)refreshView:(MJRefreshBaseView *)refreshView stateChange:(MJRefreshState)state{  
  148.   
  149.     switch (state) {  
  150.         case MJRefreshStateNormal:  
  151.             NSLog(@"%@----切换到:普通状态", refreshView.class);  
  152.               
  153.             break;  
  154.               
  155.         case MJRefreshStatePulling:  
  156.             NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);  
  157.             break;  
  158.               
  159.         case MJRefreshStateRefreshing:  
  160.             NSLog(@"%@----切换到:正在刷新状态", refreshView.class);  
  161.             break;  
  162.         default:  
  163.             break;  
  164.     }  
  165.   
  166. }  
  167.   
  168. - (void)didReceiveMemoryWarning  
  169. {  
  170.     [super didReceiveMemoryWarning];  
  171.     // Dispose of any resources that can be recreated.  
  172. }  
  173.   
  174. #pragma mark - Table view data source  
  175.   
  176. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  177. {  
  178.   
  179.     return 1;  
  180. }  
  181.   
  182. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  183. {  
  184.   
  185.     return [_oldDataArray count];  
  186. }  
  187.   
  188. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  189. {  
  190.     NewsItem * item = [_oldDataArray objectAtIndex:indexPath.row];  
  191.     static NSString *CellIdentifier = @"Cell";  
  192.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  
  193.     if (!cell) {  
  194.         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  
  195.     }  
  196.     cell.textLabel.text = [NSString stringWithFormat:@"%lu %@",indexPath.row+1,item.newsTitle];  
  197.     return cell;  
  198. }  
  199.   
  200. @end  


Block实现的主要代码:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #pragma mark 下拉刷新,要的是加载新数据---见网易新闻刷新  
  2. - (void)refreshViewOfBlock{  
  3.   
  4.     _header = [MJRefreshHeaderView header];  
  5.     _header.scrollView = self.tableView;  
  6.       
  7.     [_header setBeginRefreshingBlock:^(MJRefreshBaseView * refreshView){  
  8.           
  9.         self.dataString = [[NSString stringWithFormat:@"date=20131129&startRecord=%lu",number] stringByAppendingString:@"&len=10&udid=1234567890&terminalType=Iphone&cid=213"];  
  10.           
  11.         _request = [[HMTMyCustomNetRequest alloc] init];  
  12.         NSData * postData = [_dataString dataUsingEncoding:NSUTF8StringEncoding];  
  13.         [_request requestForPOSTWithUrl:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" postData:postData];  
  14.           
  15.         [_request setFinishLoadBlock:^(NSData * data){  
  16.               
  17.             //解析数据  
  18.             NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];  
  19.             NSArray * originalArray = [dic objectForKey:@"news"];  
  20.               
  21.             //将originalArray中的字典,逐个封装为newsItem数据对象,存储在UITableView的数据源中  
  22.             for (int i = 0; i<[originalArray count]; i++) {  
  23.                   
  24.                 //从解析得到的数组中,获取包含新闻信息的字典对象并把它封装为NewsItem类型的数据对象  
  25.                 NewsItem * item = [[NewsItem alloc] initWithDic:[originalArray objectAtIndex:i]];  
  26.                   
  27.                 //将封装好数据对象item添加到tableView的数据源中  
  28.                 [_DataArray addObject:item];  
  29.                 [item release];  
  30.                   
  31.             }  
  32.               
  33.             for (int i = 0; i < [_DataArray count]; i++) {  
  34.                   
  35.                 [self.oldDataArray insertObject:[_DataArray objectAtIndex:i] atIndex:i];  
  36.                   
  37.             }  
  38.   
  39.             [self.tableView reloadData];  
  40.             // 结束刷新  
  41.             [refreshView endRefreshing];  
  42.               
  43.         }];  
  44.     }];  
  45.     [_header setEndStateChangeBlock:^(MJRefreshBaseView * refreshView){  
  46.         NSLog(@"11111");  
  47.         self.DataArray = [NSMutableArray array];  
  48.         number += 10;  
  49.           
  50.     }];  
  51.     _header.refreshStateChangeBlock = ^(MJRefreshBaseView *refreshView, MJRefreshState state) {  
  52.         // 控件的刷新状态切换了就会调用这个block  
  53.         switch (state) {  
  54.             case MJRefreshStateNormal:  
  55.                 NSLog(@"%@----切换到:普通状态", refreshView.class);  
  56.   
  57.                 break;  
  58.                   
  59.             case MJRefreshStatePulling:  
  60.                 NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);  
  61.                 break;  
  62.                   
  63.             case MJRefreshStateRefreshing:  
  64.                 NSLog(@"%@----切换到:正在刷新状态", refreshView.class);  
  65.                 break;  
  66.             default:  
  67.                 break;  
  68.         }  
  69.     };  
  70. }  


展开阅读全文

没有更多推荐了,返回首页