首页 > 代码库 > iOS开发UI篇—在UItableview中实现加载更多功能
iOS开发UI篇—在UItableview中实现加载更多功能
iOS开发UI篇—在UItableview中实现加载更多功能
一、实现效果
点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据。
二、实现代码和说明
当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器)会加载两条数据进来。
视图部分的按钮被点击的时候,要让主控制器加载数据,刷新表格,2B青年会在视图中增加一个主控制器的属性,通过这个属性去调用进行加载,但在开发中通常通过代理模式来完成这个操作。
下面分别是两种实现的代码。
1、项目结构和说明
说明:加载更多永远都放在这个tableview的最下端,因此这里设置成了这个tableview的tableFooterView。
self.tableview.tableFooterView=footerview;
在实现上通过xib来进行处理,考虑到左右的留白,以及点击后的要切换到加载按钮和文字,要同时控制图标和文字,因此把加载图标和文字提示放在了一个view中以便控制,这个xib已经和YYfooterview.xib进行了关联,通过这个类来控制xib。
2、实现代码
(1).垃圾代码
数据模型部分
TXtg.h文件
1 // Created by 鑫 on 14-10-8. 2 // Copyright (c) 2014年 梁镋鑫. All rights reserved. 3 // 4 5 #import <Foundation/Foundation.h> 6 7 @interface TXTg : NSObject 8 /** 9 * 标题10 */11 @property(nonatomic,copy)NSString *title;12 /**13 * 价格14 */15 @property(nonatomic,copy)NSString *price;16 /**17 * 图片18 */19 @property(nonatomic,copy)NSString *icon;20 /**21 * 购买人数22 */23 @property(nonatomic,copy)NSString *buyCount;24 -(instancetype)initWithDict:(NSDictionary *)dict;25 +(instancetype)tgWithDict:(NSDictionary *)dict;26 @end
TXtg.m文件
1 #import "TXTg.h" 2 3 @implementation TXTg 4 -(instancetype)initWithDict:(NSDictionary *)dict; 5 { 6 if (self = [super init]) { 7 [self setValuesForKeysWithDictionary:dict]; 8 } 9 return self;10 }11 +(instancetype)tgWithDict:(NSDictionary *)dict12 {13 return [[self alloc]initWithDict:dict];14 15 }16 @end
视图部分
TXtgcell.h文件
1 // 屌丝逆天记-团购-01 2 // 3 // Created by 鑫 on 14-10-8. 4 // Copyright (c) 2014年 梁镋鑫. All rights reserved. 5 // 6 7 #import <UIKit/UIKit.h> 8 @class TXTg; 9 @interface TXTgCell : UITableViewCell10 /**11 * 通过一个tableview来创建一个cell12 */13 +(instancetype)cellWithTableView:(UITableView *)tableView;14 /**15 * 团购模型16 */17 @property(nonatomic ,strong)TXTg *tg;18 19 @end
TXtgcell.m文件
1 #import "TXTgCell.h" 2 #import "TXTg.h" 3 @interface TXTgCell() 4 @property (weak, nonatomic) IBOutlet UIImageView *iconView; 5 @property (weak, nonatomic) IBOutlet UILabel *titleView; 6 @property (weak, nonatomic) IBOutlet UILabel *priceView; 7 @property (weak, nonatomic) IBOutlet UILabel *buyCountView; 8 9 @end10 @implementation TXTgCell11 +(instancetype)cellWithTableView:(UITableView *)tableView12 {13 static NSString *ID =@"tg";14 TXTgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];15 if (cell ==nil) {16 //从xib中加载cell17 cell = [[[NSBundle mainBundle] loadNibNamed:@"TXTgCell" owner:nil options:nil] lastObject];18 }19 return cell;20 }21 -(void)setTg:(TXTg *)tg22 {23 _tg = tg;24 25 //图片26 self.iconView.image = [UIImage imageNamed:tg.icon];27 self.titleView.text = tg.title;28 self.priceView.text = [NSString stringWithFormat:@"¥%@",tg.price];29 30 self.buyCountView.text = [NSString stringWithFormat:@"%@人已购买", tg.buyCount];31 }32 33 34 35 @end
TXTgFooterView.h文件
1 #import <UIKit/UIKit.h> 2 @class TXViewController; 3 @interface TXTgFooterView : UIView 4 /** 5 * 快速创建一个footerView对象 6 7 */ 8 +(instancetype )footerView; 9 @property(nonatomic ,strong)TXViewController *controller;10 11 @end
TXTgFooterView.m文件
1 #import "TXTgFooterView.h" 2 #import "TXViewController.h" 3 @interface TXTgFooterView() 4 @property (weak, nonatomic) IBOutlet UIButton *loadBtn; 5 @property (weak, nonatomic) IBOutlet UIView *loadingView; 6 7 @end 8 @implementation TXTgFooterView 9 +(instancetype)footerView10 {11 return [[[NSBundle mainBundle] loadNibNamed:@"TXTgFooterView" owner:nil options:nil] lastObject];12 }13 - (IBAction)loadBtnClick {14 //隐藏加载按钮15 self.loadBtn.hidden = YES;16 //显示正在加载17 self.loadingView.hidden = NO;18 19 //显示更多按钮20 //GCD延迟加载21 22 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 3.0s后执行block里面的代码23 24 [self.controller loadingMoreData];25 26 // 4.显示加载按钮27 self.loadBtn.hidden = NO;28 29 // 5.隐藏"正在加载"30 self.loadingView.hidden = YES;31 32 });33 34 35 36 }37 38 39 @end
主控制器
TXViewController.h文件
1 #import <UIKit/UIKit.h>2 3 @interface TXViewController : UIViewController4 - (void)loadingMoreData;5 @end
TXViewController.m文件
1 #import "TXViewController.h" 2 #import "TXTg.h" 3 #import "TXTgCell.h" 4 #import "TXTgFooterView.h" 5 @interface TXViewController ()<UITableViewDataSource> 6 @property (weak, nonatomic) IBOutlet UITableView *tableview; 7 8 @property(nonatomic ,strong)NSMutableArray *tgs; 9 10 @end 11 12 @implementation TXViewController 13 14 - (void)viewDidLoad 15 { 16 [super viewDidLoad]; 17 //设置每一行cell的高度 18 self.tableview.rowHeight =80; 19 20 //设置footerView 21 TXTgFooterView * footer = [TXTgFooterView footerView]; 22 footer.controller = self; 23 self.tableview.tableFooterView = footer; 24 25 } 26 /** 27 * 隐藏状态栏 28 */ 29 - (BOOL)prefersStatusBarHidden 30 { 31 return YES; 32 } 33 /** 34 * 数据的懒加载 35 */ 36 -(NSMutableArray *)tgs 37 { 38 if (_tgs ==nil) { 39 //初始化 40 NSString *path = [[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil]; 41 //加载数组 42 43 NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; 44 45 //3.将dictArray里面的所有字典转成模型对象,放到新的数组中 46 NSMutableArray *tgArray = [NSMutableArray array]; 47 48 for (NSDictionary *dict in dictArray) { 49 //创建模型对象 50 TXTg *tg = [TXTg tgWithDict:dict]; 51 52 // 加载模型对象倒数组中 53 [tgArray addObject:tg]; 54 55 } 56 _tgs = tgArray; 57 58 } 59 return _tgs; 60 } 61 /** 62 * 加载更多的数据 63 */ 64 -(void)loadingMoreData 65 { 66 //添加更多模型数据 67 TXTg *tg = [[TXTg alloc]init]; 68 tg.icon =@"ad_01"; 69 tg.title = @"jsfsdfjjsd"; 70 tg.price = @"100"; 71 tg.buyCount = @"0"; 72 [self.tgs addObject:tg]; 73 // 2.刷新表格(告诉tableView重新加载模型数据, 调用tableView的reloadData) 74 [self.tableview reloadData]; 75 76 } 77 78 #pragma mark --数据源方法 79 /** 80 * 一共多少行 81 */ 82 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 83 { 84 return self.tgs.count; 85 } 86 /** 87 * 每一行显示怎样的cell 88 */ 89 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 90 { 91 //创建cell 92 TXTgCell *cell = [TXTgCell cellWithTableView:tableView]; 93 94 //给cell传递模型数据 95 cell.tg = self.tgs[indexPath.row]; 96 return cell; 97 } 98 - (void)didReceiveMemoryWarning 99 {100 [super didReceiveMemoryWarning];101 // Dispose of any resources that can be recreated.102 }103 104 @end
2.通过代理完成
当按钮被点击的时候,视图部分本身不干活,而是通知它的代理(控制器)完成接下来的操作。
该部分代码在1的基础上对下面几个文件进行了修改:
视图部分:
TXTgFooterView.h文件
1 #import <UIKit/UIKit.h> 2 @class TXTgFooterView; 3 /** 4 1.协议名称: 控件类名 + Delegate 5 2.代理方法普遍都是@optional 6 3. 7 */ 8 @protocol TXTfFooterViewDelegate <NSObject> 9 10 @optional11 -(void)tgFooterViewDidClickedLoadBtn:(TXTgFooterView *)tgFooterView;12 13 @end14 15 16 @interface TXTgFooterView : UIView17 18 /**19 * 快速创建一个footerView对象20 */21 + (instancetype)footerView;22 23 //定义一个代理,这个代理必须实现<TXTgFooterViewDelegate>这个协议24 @property(nonatomic,weak) id <TXTfFooterViewDelegate> delegate;25 26 27 @end
TXTgFooterView.m文件
1 #import "TXTgFooterView.h" 2 #import "TXViewController.h" 3 4 @interface TXTgFooterView() 5 - (IBAction)loadBtnClick; 6 @property (weak, nonatomic) IBOutlet UIButton *loadBtn; 7 @property (weak, nonatomic) IBOutlet UIView *loadingView; 8 @end 9 10 @implementation TXTgFooterView11 12 + (instancetype)footerView13 {14 return [[[NSBundle mainBundle] loadNibNamed:@"TXTgFooterView" owner:nil options:nil] lastObject];15 }16 17 /**18 * 点击"加载"按钮19 */20 - (IBAction)loadBtnClick {21 // 1.隐藏加载按钮22 self.loadBtn.hidden = YES;23 24 // 2.显示"正在加载"25 self.loadingView.hidden = NO;26 27 // 3.显示更多的数据28 // GCD29 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 3.0s后执行block里面的代码30 if ([self.delegate respondsToSelector:@selector(tgFooterViewDidClickedLoadBtn:)]) {31 [self.delegate tgFooterViewDidClickedLoadBtn:self];32 }33 // 4.显示加载按钮34 self.loadBtn.hidden = NO;35 36 // 5.隐藏"正在加载"37 self.loadingView.hidden = YES;38 });39 }40 @end
主控制器部分
TXViewController.h文件
1 #import <UIKit/UIKit.h>2 3 @interface TXViewController : UIViewController4 - (void)loadingMoreData;5 @end
TXViewController.m文件
1 #import "TXViewController.h" 2 #import "TXTg.h" 3 #import "TXTgCell.h" 4 #import "TXTgFooterView.h" 5 #import "TXTXTgHeaderView.h" 6 @interface TXViewController () <UITableViewDataSource,TXTfFooterViewDelegate> 7 @property (weak, nonatomic) IBOutlet UITableView *tableView; 8 @property (nonatomic, strong) NSMutableArray *tgs; 9 @end 10 11 @implementation TXViewController 12 13 - (void)viewDidLoad 14 { 15 [super viewDidLoad]; 16 17 // 设置每一行cell的高度 18 self.tableView.rowHeight = 80; 19 20 // 设置footerView 21 TXTgFooterView *footer = [TXTgFooterView footerView]; 22 footer.delegate =self; 23 self.tableView.tableFooterView = footer; 24 25 26 //设置headerView 27 self.tableView.tableHeaderView = [TXTXTgHeaderView headerView]; 28 29 // 设置tableView尾部显示的控件(tableFooterView的宽度永远是tableView的宽度) 30 // tableFooterView只需要设置高度 31 // UIButton *footerBtn = [UIButton buttonWithType:UIButtonTypeSystem]; 32 // footerBtn.frame = CGRectMake(0, 0, 0, 35); 33 // footerBtn.backgroundColor = [UIColor orangeColor]; 34 // [footerBtn setTitle:@"加载更多团购" forState:UIControlStateNormal]; 35 36 // UINib *nib = [UINib nibWithNibName:@"TXTgFooterView" bundle:[NSBundle mainBundle]]; 37 38 // 创建nib对象 39 // UINib *nib = [UINib nibWithNibName:@"TXTgFooterView" bundle:nil]; 40 // 41 // // 加载xib\nib 42 // UIView *footerView = [[nib instantiateWithOwner:nil options:nil] lastObject]; 43 // self.tableView.tableFooterView = footerView; 44 } 45 46 /** 47 * 加载更多的数据 48 */ 49 - (void)tgFooterViewDidClickedLoadBtn:(TXTgFooterView *)tgFooterView 50 { 51 #warning 正常开发:发送网络请求给远程的服务器 52 // 1.添加更多的模型数据 53 TXTg *tg = [[TXTg alloc] init]; 54 tg.icon = @"ad_01"; 55 tg.title = @"新增加的团购数据.."; 56 tg.price = @"100"; 57 tg.buyCount = @"0"; 58 [self.tgs addObject:tg]; 59 60 // 2.刷新表格(告诉tableView重新加载模型数据, 调用tableView的reloadData) 61 [self.tableView reloadData]; 62 } 63 64 /** 65 * 隐藏状态栏 66 */ 67 - (BOOL)prefersStatusBarHidden 68 { 69 return YES; 70 } 71 72 /** 73 * 数据的懒加载 74 */ 75 - (NSMutableArray *)tgs 76 { 77 if (_tgs == nil) { 78 // 初始化 79 // 1.获得plist的全路径 80 NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil]; 81 82 // 2.加载数组 83 NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; 84 85 // 3.将dictArray里面的所有字典转成模型对象,放到新的数组中 86 NSMutableArray *tgArray = [NSMutableArray array]; 87 for (NSDictionary *dict in dictArray) { 88 // 3.1.创建模型对象 89 TXTg *tg = [TXTg tgWithDict:dict]; 90 91 // 3.2.添加模型对象到数组中 92 [tgArray addObject:tg]; 93 } 94 95 // 4.赋值 96 _tgs = tgArray; 97 } 98 return _tgs; 99 }100 101 #pragma mark - 数据源方法102 /**103 * 一共有多少行数据104 */105 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section106 {107 return self.tgs.count;108 }109 110 /**111 * 每一行显示怎样的cell112 */113 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath114 {115 // 1.创建cell116 TXTgCell *cell = [TXTgCell cellWithTableView:tableView];117 118 // 2.给cell传递模型数据119 cell.tg = self.tgs[indexPath.row];120 return cell;121 }122 @end
iOS开发UI篇—在UItableview中实现加载更多功能