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可以自动进入下拉刷新状态
- #import "NewsListViewController.h"
- #import "HMTMyCustomNetRequest.h"
- #import "NewsItem.h"
- #import "MJRefresh.h"
- @interface NewsListViewController () <MJRefreshBaseViewDelegate>
- {
- HMTMyCustomNetRequest * _request;
- MJRefreshHeaderView * _header;
- MJRefreshFooterView * _footer;
- NSUInteger number;
- }
- @property (nonatomic,retain)NSMutableArray * newDataArray;
- @property (nonatomic,retain)NSMutableArray * oldDataArray;
- @property (nonatomic,copy)NSString * dataString;
- @end
- @implementation NewsListViewController
- - (void)dealloc
- {
- [_header release];
- [_footer release];
- RELEASE_SAFELY(_dataString);
- RELEASE_SAFELY(_newDataArray);
- RELEASE_SAFELY(_oldDataArray);
- //取消网络请求
- [_request cancelNSURLConnection];
- _request = nil;
- [super dealloc];
- }
- - (id)initWithStyle:(UITableViewStyle)style
- {
- self = [super initWithStyle:style];
- if (self) {
- // Custom initialization
- }
- return self;
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- number = 0;
- #pragma mark 从顶部往下刷新------>下拉刷新
- _header = [MJRefreshHeaderView header];
- _header.scrollView = self.tableView;
- _header.delegate = self;
- #pragma mark 从底部往上刷新------>上拉刷新
- _footer = [MJRefreshFooterView footer];
- _footer.scrollView = self.tableView;
- _footer.delegate = self;
- self.newDataArray = [NSMutableArray array];
- self.oldDataArray = [NSMutableArray array];
- }
- #pragma mark - 开始刷新
- - (void)refreshViewBeginRefreshing:(MJRefreshBaseView *)refreshView{
- self.dataString = [[NSString stringWithFormat:@"date=20131129&startRecord=%lu",number] stringByAppendingString:@"&len=10&udid=1234567890&terminalType=Iphone&cid=213"];
- _request = [[HMTMyCustomNetRequest alloc] init];
- NSData * postData = [_dataString dataUsingEncoding:NSUTF8StringEncoding];
- [_request requestForPOSTWithUrl:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" postData:postData];
- [_request setFinishLoadBlock:^(NSData * data){
- //解析数据
- NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
- NSArray * originalArray = [dic objectForKey:@"news"];
- //将originalArray中的字典,逐个封装为newsItem数据对象,存储在UITableView的数据源中
- for (int i = 0; i<[originalArray count]; i++) {
- //从解析得到的数组中,获取包含新闻信息的字典对象并把它封装为NewsItem类型的数据对象
- NewsItem * item = [[NewsItem alloc] initWithDic:[originalArray objectAtIndex:i]];
- //将封装好数据对象item添加到tableView的数据源中
- [_newDataArray addObject:item];
- [item release];
- }
- #pragma mark 下拉刷新,要的是加载新数据---见网易新闻刷新
- if ([refreshView isMemberOfClass:[MJRefreshHeaderView class]]) {
- for (int i = 0; i < [_newDataArray count]; i++) {
- [self.oldDataArray insertObject:[_newDataArray objectAtIndex:i] atIndex:i];
- }
- [self.tableView reloadData];
- // 结束刷新
- [refreshView endRefreshing];
- #pragma mark 上拉加载,要的是加载更多数据---见百度贴吧翻页
- }else if([refreshView isMemberOfClass:[MJRefreshFooterView class]]){
- for (int i = 0; i < [_newDataArray count]; i++) {
- [self.oldDataArray addObject:[_newDataArray objectAtIndex:i]];
- }
- [self.tableView reloadData];
- // 结束刷新
- [refreshView endRefreshing];
- }
- }];
- }
- #pragma mark - 刷新结束时调用的方法
- - (void)refreshViewEndRefreshing:(MJRefreshBaseView *)refreshView{
- // 下拉刷新
- if ([refreshView isMemberOfClass:[MJRefreshHeaderView class]]) {
- self.newDataArray = [NSMutableArray array];
- number += 10;
- } else {
- self.newDataArray = [NSMutableArray array];
- number += 10;
- }
- }
- #pragma mark - 监测状态
- - (void)refreshView:(MJRefreshBaseView *)refreshView stateChange:(MJRefreshState)state{
- switch (state) {
- case MJRefreshStateNormal:
- NSLog(@"%@----切换到:普通状态", refreshView.class);
- break;
- case MJRefreshStatePulling:
- NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);
- break;
- case MJRefreshStateRefreshing:
- NSLog(@"%@----切换到:正在刷新状态", refreshView.class);
- break;
- default:
- break;
- }
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- #pragma mark - Table view data source
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return 1;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return [_oldDataArray count];
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- NewsItem * item = [_oldDataArray objectAtIndex:indexPath.row];
- static NSString *CellIdentifier = @"Cell";
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (!cell) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
- }
- cell.textLabel.text = [NSString stringWithFormat:@"%lu %@",indexPath.row+1,item.newsTitle];
- return cell;
- }
- @end
Block实现的主要代码:
- #pragma mark 下拉刷新,要的是加载新数据---见网易新闻刷新
- - (void)refreshViewOfBlock{
- _header = [MJRefreshHeaderView header];
- _header.scrollView = self.tableView;
- [_header setBeginRefreshingBlock:^(MJRefreshBaseView * refreshView){
- self.dataString = [[NSString stringWithFormat:@"date=20131129&startRecord=%lu",number] stringByAppendingString:@"&len=10&udid=1234567890&terminalType=Iphone&cid=213"];
- _request = [[HMTMyCustomNetRequest alloc] init];
- NSData * postData = [_dataString dataUsingEncoding:NSUTF8StringEncoding];
- [_request requestForPOSTWithUrl:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx" postData:postData];
- [_request setFinishLoadBlock:^(NSData * data){
- //解析数据
- NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
- NSArray * originalArray = [dic objectForKey:@"news"];
- //将originalArray中的字典,逐个封装为newsItem数据对象,存储在UITableView的数据源中
- for (int i = 0; i<[originalArray count]; i++) {
- //从解析得到的数组中,获取包含新闻信息的字典对象并把它封装为NewsItem类型的数据对象
- NewsItem * item = [[NewsItem alloc] initWithDic:[originalArray objectAtIndex:i]];
- //将封装好数据对象item添加到tableView的数据源中
- [_DataArray addObject:item];
- [item release];
- }
- for (int i = 0; i < [_DataArray count]; i++) {
- [self.oldDataArray insertObject:[_DataArray objectAtIndex:i] atIndex:i];
- }
- [self.tableView reloadData];
- // 结束刷新
- [refreshView endRefreshing];
- }];
- }];
- [_header setEndStateChangeBlock:^(MJRefreshBaseView * refreshView){
- NSLog(@"11111");
- self.DataArray = [NSMutableArray array];
- number += 10;
- }];
- _header.refreshStateChangeBlock = ^(MJRefreshBaseView *refreshView, MJRefreshState state) {
- // 控件的刷新状态切换了就会调用这个block
- switch (state) {
- case MJRefreshStateNormal:
- NSLog(@"%@----切换到:普通状态", refreshView.class);
- break;
- case MJRefreshStatePulling:
- NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);
- break;
- case MJRefreshStateRefreshing:
- NSLog(@"%@----切换到:正在刷新状态", refreshView.class);
- break;
- default:
- break;
- }
- };
- }
-
错误代码:
objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self);
Too many arguments to function call, expected 0, have 3
经过几番周折,终于叨叨解决方案了
选中项目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND 将其设置为 NO 即可。
12如果在 xcode6 . 0中有错误:选中项目 - Project - Build Settings - Apple LLVM 6.0 - Preprocessing中的 Enable Strict Checking of objc_msgsend calls 设置为 NO 即可