iOS开发UI篇—在UItableview中实现加载更多功能

简介:

一、实现效果

点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据。

二、实现代码和说明

当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器)会加载两条数据进来。

视图部分的按钮被点击的时候,要让主控制器加载数据,刷新表格,2B青年会在视图中增加一个主控制器的属性,通过这个属性去调用进行加载,但在开发中通常通过代理模式来完成这个操作。

下面分别是两种实现的代码。

1、项目结构和说明

说明:加载更多永远都放在这个tableview的最下端,因此这里设置成了这个tableview的tableFooterView。

self.tableview.tableFooterView=footerview;

在实现上通过xib来进行处理,考虑到左右的留白,以及点击后的要切换到加载按钮和文字,要同时控制图标和文字,因此把加载图标和文字提示放在了一个view中以便控制,这个xib已经和YYfooterview.xib进行了关联,通过这个类来控制xib。

2、实现代码

(1).垃圾代码

数据模型部分

YYtg.h文件

复制代码
 1 //  2 // YYtg.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <Foundation/Foundation.h>
10 #import "Global.h" 11 12 @interface YYtgModel : NSObject
13 @property(nonatomic,copy)NSString *icon;
14 @property(nonatomic,copy)NSString *buyCount;
15 @property(nonatomic,copy)NSString *title;
16 @property(nonatomic,copy)NSString *price;
17 18 //对外接口 19 YYinitH(tg)
20 @end
复制代码

YYtg.m文件

复制代码
 1 //  2 // YYtg.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtgModel.h" 10 11 @implementation YYtgModel
12 YYinitM(tg)
13 @end
复制代码

注意:对于数据转模型部分的构造方法接口和实现代码已经通过自定义带参数的宏来进行了封装。

封装代码如下:

复制代码
 1 #ifndef _0____________Global_h
 2 #define _0____________Global_h
 3  4 /**
 5  * 自定义带参数的宏
 6 */  7 #define YYinitH(name) -(instancetype)initWithDict:(NSDictionary *)dict;\
 8 +(instancetype)name##WithDict:(NSDictionary *)dict;
 9 10 11 #define YYinitM(name) -(instancetype)initWithDict:(NSDictionary *)dict\
12 {\
13 if (self=[super init]) {\
14  [self setValuesForKeysWithDictionary:dict];\
15  }\
16 return self;\
17 }\
18 \
19 +(instancetype)name##WithDict:(NSDictionary *)dict\
20 {\
21 return [[self alloc]initWithDict:dict];\
22 }\
23 24 #endif
复制代码

视图部分

YYtgcell.h文件

复制代码
 1 //  2 // YYtgcell.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 #import "YYtgModel.h" 11 12 @interface YYtgcell : UITableViewCell
13 @property(nonatomic,strong)YYtgModel *yytg;
14 15 //把加载数据(使用xib创建cell的内部细节进行封装) 16 +(instancetype)tgcellWithTableView:(UITableView *)tableView;
17 @end
复制代码

YYtgcell.m文件

复制代码
 1 //  2 // YYtgcell.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYtgcell.h" 10 //私有扩展 11 @interface YYtgcell()
12 @property (strong, nonatomic) IBOutlet UIImageView *img;
13 @property (strong, nonatomic) IBOutlet UILabel *titlelab;
14 @property (strong, nonatomic) IBOutlet UILabel *pricelab;
15 @property (strong, nonatomic) IBOutlet UILabel *buycountlab;
16 @end 17 @implementation YYtgcell
18 19 #pragma mark 重写set方法,完成数据的赋值操作
20 -(void)setYytg:(YYtgModel *)yytg
21 {
22 _yytg=yytg;
23 self.img.image=[UIImage imageNamed:yytg.icon];
24 self.titlelab.text=yytg.title;
25 self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];
26 self.buycountlab.text=[NSString stringWithFormat:@"已有%@人购买",yytg.buyCount];
27 }
28 29 +(instancetype)tgcellWithTableView:(UITableView *)tableView
30 {
31 static NSString *identifier= @"tg";
32 YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
33 if (cell==nil) {
34 //如何让创建的cell加个戳
35 //对于加载的xib文件,可以到xib视图的属性选择器中进行设置 36 cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];
37 NSLog(@"创建了一个cell");
38  }
39 return cell;
40 }
41 42 @end
复制代码

YYfooterview.h文件

复制代码
 1 //  2 // YYfooterview.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 @class YYViewController;
11 @interface YYfooterview : UIView
12 @property(nonatomic,strong) YYViewController *controller;
13 @end
复制代码

YYfooterview.m文件

复制代码
 1 //  2 // YYfooterview.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYfooterview.h" 10 #import "YYViewController.h" 11 12 @interface YYfooterview ()
13 @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *loadingview;
14 @property (strong, nonatomic) IBOutlet UIButton *loadbtn;
15 16 @end 17 @implementation YYfooterview
18 - (IBAction)loadbtclick {
19 NSLog(@"按钮被点击了");
20 //隐藏按钮 21 self.loadbtn.hidden=YES;
22 //显示菊花 23 self.loadingview.hidden=NO;
24 25 #warning 模拟发送网络请求, 3秒之后隐藏菊花
26 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
27 // 3.调用控制的加载数据方法 28  [self.controller LoadMore];
29 // 4.隐藏菊花视图 30 self.loadingview.hidden = YES;
31 // 5.显示按钮 32 self.loadbtn.hidden = NO;
33  });
34 }
35 36 @end
复制代码

主控制器

YYViewController.h文件

复制代码
 1 //  2 // YYViewController.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 11 @interface YYViewController : UIViewController
12 //公开接口
13 //- (void)LoadMore; 14 @end
复制代码

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h"  10 #import "YYtgModel.h"  11 #import "YYtgcell.h"  12 #import "YYfooterview.h"  13  14 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
 15 @property (strong, nonatomic) IBOutlet UITableView *tableview;
 16  17 @property(strong,nonatomic)NSMutableArray *tg;
 18 @end  19  20 @implementation YYViewController
 21  22 #pragma mark-加载数据方法
 23 -(void)LoadMore
 24 {
 25 //创建模型  26 YYtgModel *tgmodel=[[YYtgModel alloc]init];
 27 tgmodel.title=@"菜好上桌";
 28 tgmodel.icon=@"5ee372ff039073317a49af5442748071";
 29 tgmodel.buyCount=@"20";
 30 tgmodel.price=@"10000";
 31 //将模型添加到数组中  32  [self.tg addObject:tgmodel];
 33  34 YYtgModel *tgmodelq=[[YYtgModel alloc]init];
 35 tgmodelq.title=@"菜好上桌1";
 36 tgmodelq.icon=@"5ee372ff039073317a49af5442748071";
 37 tgmodelq.buyCount=@"20";
 38 tgmodelq.price=@"10000";
 39  40  [self.tg addObject:tgmodelq];
 41 //刷新表格  42  [self.tableview reloadData];
 43 }
 44  45 - (void)viewDidLoad
 46 {
 47  [super viewDidLoad];
 48 self.tableview.rowHeight=80.f;
 49  50 //加载底部视图
 51 //从xib中获取数据  52 UINib *nib=[UINib nibWithNibName:@"YYfooterview" bundle:nil];
 53 YYfooterview *footerview=[[nib instantiateWithOwner:nil options:nil] firstObject];
 54 self.tableview.tableFooterView=footerview;
 55 //设置控制  56 footerview.controller=self;
 57 }
 58 #pragma mark- 懒加载
 59 -(NSArray *)tg
 60 {
 61 if (_tg==nil) {
 62 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
 63 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
 64  65 NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
 66 for (NSDictionary *dict in temparray) {
 67 YYtgModel *tg=[YYtgModel tgWithDict:dict];
 68  [arrayM addObject:tg];
 69  }
 70 _tg=arrayM;
 71  }
 72 return _tg;
 73 }
 74  75 #pragma mark- xib创建cell数据处理
 76  77 #pragma mark 多少组
 78 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 79 {
 80 return 1;
 81 }
 82  83 #pragma mark多少行
 84 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 85 {
 86 return self.tg.count;
 87 }
 88  89 #pragma mark设置每组每行
 90 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 91 {
 92 //1.创建cell  93 YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];
 94  95 //2.获取当前行的模型,设置cell的数据  96 YYtgModel *tg=self.tg[indexPath.row];
 97 cell.yytg=tg;
 98  99 //3.返回cell 100 return cell;
101 }
102 103 #pragma mark- 隐藏状态栏
104 -(BOOL)prefersStatusBarHidden
105 {
106 return YES;
107 }
108 109 @end
复制代码

2.通过代理完成

当按钮被点击的时候,视图部分本身不干活,而是通知它的代理(控制器)完成接下来的操作。

该部分代码在1的基础上对下面几个文件进行了修改:

视图部分:

YYfooterview.h文件

复制代码
 1 //  2 // YYfooterview.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 @class YYViewController ,YYfooterview;
11 //约定协议 12 @protocol YYfooterviewDelegate <NSObject> 13 -(void)footerviewLoadMore;
14 @end 15 16 @interface YYfooterview : UIView
17 18 //声明一个id类型属性,遵守了协议的“人”即可成为它的代理 19 @property(nonatomic,strong)id<YYfooterviewDelegate> delegate;
20 //@property(nonatomic,strong) YYViewController *controller; 21 @end
复制代码

YYfooterview.m文件

复制代码
 1 //  2 // YYfooterview.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYfooterview.h" 10 #import "YYViewController.h" 11 12 @interface YYfooterview ()
13 @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *loadingview;
14 @property (strong, nonatomic) IBOutlet UIButton *loadbtn;
15 16 @end 17 @implementation YYfooterview
18 - (IBAction)loadbtclick {
19 NSLog(@"按钮被点击了");
20 //隐藏按钮 21 self.loadbtn.hidden=YES;
22 //显示菊花 23 self.loadingview.hidden=NO;
24 25 #warning 模拟发送网络请求, 3秒之后隐藏菊花
26 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
27 // 3.调用控制的加载数据方法
28 // [self.controller LoadMore];
29 //通知代理 30  [self.delegate footerviewLoadMore];
31 // 4.隐藏菊花视图 32 self.loadingview.hidden = YES;
33 // 5.显示按钮 34 self.loadbtn.hidden = NO;
35  });
36 }
37 38 @end
复制代码

主控制器部分

YYViewController.h文件

复制代码
 1 //  2 // YYViewController.h
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import <UIKit/UIKit.h>
10 11 @interface YYViewController : UIViewController
12 //公开接口
13 //- (void)LoadMore; 14 @end
复制代码

YYViewController.m文件

复制代码
 1 //  2 // YYViewController.m
 3 // 02-团购(使用xib和类完成数据展示)
 4 //  5 // Created by apple on 14-5-29.
 6 // Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8  9 #import "YYViewController.h"  10 #import "YYtgModel.h"  11 #import "YYtgcell.h"  12 #import "YYfooterview.h"  13  14 @interface YYViewController ()<UITableViewDataSource,UITableViewDelegate,YYfooterviewDelegate>
 15 @property (strong, nonatomic) IBOutlet UITableView *tableview;
 16  17 @property(strong,nonatomic)NSMutableArray *tg;
 18 @end  19  20 @implementation YYViewController
 21  22 #pragma mark-加载数据方法
 23 -(void)footerviewLoadMore
 24 {
 25 //创建模型  26 YYtgModel *tgmodel=[[YYtgModel alloc]init];
 27 tgmodel.title=@"菜好上桌";
 28 tgmodel.icon=@"5ee372ff039073317a49af5442748071";
 29 tgmodel.buyCount=@"20";
 30 tgmodel.price=@"10000";
 31 //将模型添加到数组中  32  [self.tg addObject:tgmodel];
 33  34 YYtgModel *tgmodelq=[[YYtgModel alloc]init];
 35 tgmodelq.title=@"菜好上桌1";
 36 tgmodelq.icon=@"5ee372ff039073317a49af5442748071";
 37 tgmodelq.buyCount=@"20";
 38 tgmodelq.price=@"10000";
 39  40  [self.tg addObject:tgmodelq];
 41 //刷新表格  42  [self.tableview reloadData];
 43 }
 44 //-(void)LoadMore
 45 //{
 46 // //创建模型
 47 // YYtgModel *tgmodel=[[YYtgModel alloc]init];
 48 // tgmodel.title=@"菜好上桌";
 49 // tgmodel.icon=@"5ee372ff039073317a49af5442748071";
 50 // tgmodel.buyCount=@"20";
 51 // tgmodel.price=@"10000";
 52 // //将模型添加到数组中
 53 // [self.tg addObject:tgmodel];
 54 //  55 // YYtgModel *tgmodelq=[[YYtgModel alloc]init];
 56 // tgmodelq.title=@"菜好上桌1";
 57 // tgmodelq.icon=@"5ee372ff039073317a49af5442748071";
 58 // tgmodelq.buyCount=@"20";
 59 // tgmodelq.price=@"10000";
 60 //  61 // [self.tg addObject:tgmodelq];
 62 // //刷新表格
 63 // [self.tableview reloadData];
 64 //}  65  66 - (void)viewDidLoad
 67 {
 68  [super viewDidLoad];
 69 self.tableview.rowHeight=80.f;
 70  71 //加载底部视图
 72 //从xib中获取数据  73 UINib *nib=[UINib nibWithNibName:@"YYfooterview" bundle:nil];
 74 YYfooterview *footerview=[[nib instantiateWithOwner:nil options:nil] firstObject];
 75 self.tableview.tableFooterView=footerview;
 76 //设置控制
 77 // footerview.controller=self;
 78 //设置代理  79 footerview.delegate=self;
 80 }
 81 #pragma mark- 懒加载
 82 -(NSArray *)tg
 83 {
 84 if (_tg==nil) {
 85 NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];
 86 NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];
 87  88 NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];
 89 for (NSDictionary *dict in temparray) {
 90 YYtgModel *tg=[YYtgModel tgWithDict:dict];
 91  [arrayM addObject:tg];
 92  }
 93 _tg=arrayM;
 94  }
 95 return _tg;
 96 }
 97  98 #pragma mark- xib创建cell数据处理
 99 100 #pragma mark 多少组
101 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
102 {
103 return 1;
104 }
105 106 #pragma mark多少行
107 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
108 {
109 return self.tg.count;
110 }
111 112 #pragma mark设置每组每行
113 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
114 {
115 //1.创建cell 116 YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];
117 118 //2.获取当前行的模型,设置cell的数据 119 YYtgModel *tg=self.tg[indexPath.row];
120 cell.yytg=tg;
121 122 //3.返回cell 123 return cell;
124 }
125 126 #pragma mark- 隐藏状态栏
127 -(BOOL)prefersStatusBarHidden
128 {
129 return YES;
130 }
131 132 @end
复制代码
目录
相关文章
|
7天前
|
搜索推荐 API 开发工具
打造个性化天气应用:从零开始的iOS开发之旅
【8月更文挑战第31天】本文是一篇针对初学者的iOS应用开发指南,将引导读者通过Swift和iOS SDK构建一个简单而美观的天气应用。我们将探索如何利用API获取实时天气数据,并在应用中实现用户友好的界面设计。文章不仅包括代码示例,还提供了设计理念和用户体验优化的建议,旨在帮助初学者理解iOS开发的基础知识,并激发他们创造个性化应用的兴趣。
|
8天前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
1天前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。
|
1天前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
10 3
|
4天前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
9天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
5天前
|
开发工具 Swift iOS开发
探索iOS开发中的SwiftUI框架
【9月更文挑战第1天】在本文中,我们将一起潜入iOS开发的海洋,特别聚焦于SwiftUI这一现代且富有表现力的框架。SwiftUI不仅简化了界面设计流程,还为开发者提供了声明式Swift语法的便利。通过这篇文章,你将学会如何利用SwiftUI构建灵活且响应式的用户界面,并理解其背后的原理。无论你是刚入门的新手还是寻求进阶的开发者,本文都将为你提供有价值的指导和启示。
|
8天前
|
开发工具 C语言 Swift
探索iOS开发之旅:从入门到精通
【8月更文挑战第30天】在这篇文章中,我们将一起踏上一场关于iOS开发的奇妙旅程。无论你是刚刚接触iOS开发的新手,还是希望提升自己技能的开发者,这篇文章都将为你提供有价值的指导和启示。我们将从基础的iOS开发概念开始,逐步深入到高级技巧和最佳实践。通过这篇文章,你将了解到如何构建一个成功的iOS应用程序,以及如何不断提升自己的开发技能。让我们一起开启这场探索之旅吧!
20 4
|
8天前
|
Swift iOS开发 开发者
探索iOS开发:SwiftUI的魔力
【8月更文挑战第30天】在这篇文章中,我们将一起揭开SwiftUI的神秘面纱,这是Apple为iOS开发者带来的一种创新和简化界面设计的框架。通过直观易懂的语言和实际案例,我们会深入探讨SwiftUI如何让代码变得像诗一样优美,同时提升开发效率。你将看到,即便是编程初学者也能迅速上手,构建出令人惊叹的应用界面。让我们跟随SwiftUI的步伐,开启一段高效、愉悦的开发旅程。
|
7天前
|
API iOS开发
探索iOS开发:打造你的第一个天气应用
【8月更文挑战第31天】 在这篇文章中,我们将一起潜入iOS开发的海洋,从初学者的角度出发,一步步构建我们自己的天气应用。通过实际的项目实践,你将学习到如何获取网络数据、如何在界面上展示这些数据,以及如何处理用户交互。文章以通俗易懂的语言,结合代码示例,引导你理解并实现一个简单天气应用的核心功能。无论你是编程新手还是希望扩展你的iOS开发技能,这篇文章都将为你提供宝贵的指导和启发。