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

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

一、实现效果

 

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

 

二、实现代码和说明

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

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

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

1、项目结构和说明

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

 self.tableview.tableFooterView=footerview;

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

2、实现代码

(1).垃圾代码

数据模型部分

YYtg.h文件

//
//  YYtg.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Global.h"@interface YYtgModel : NSObject
@property(nonatomic,copy)NSString *icon;
@property(nonatomic,copy)NSString *buyCount;
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *price;//对外接口
YYinitH(tg)
@end

YYtg.m文件

//
//  YYtg.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYtgModel.h"@implementation YYtgModel
YYinitM(tg)
@end

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

封装代码如下:

#ifndef _0____________Global_h
#define _0____________Global_h/***  自定义带参数的宏*/
#define     YYinitH(name)   -(instancetype)initWithDict:(NSDictionary *)dict;\
+(instancetype)name##WithDict:(NSDictionary *)dict;#define     YYinitM(name)  -(instancetype)initWithDict:(NSDictionary *)dict\
{\if (self=[super init]) {\[self setValuesForKeysWithDictionary:dict];\}\return self;\
}\
\
+(instancetype)name##WithDict:(NSDictionary *)dict\
{\return [[self alloc]initWithDict:dict];\
}\#endif

视图部分

YYtgcell.h文件

//
//  YYtgcell.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "YYtgModel.h"@interface YYtgcell : UITableViewCell
@property(nonatomic,strong)YYtgModel *yytg;//把加载数据(使用xib创建cell的内部细节进行封装)
+(instancetype)tgcellWithTableView:(UITableView *)tableView;
@end

YYtgcell.m文件

//
//  YYtgcell.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYtgcell.h"
//私有扩展
@interface YYtgcell()
@property (strong, nonatomic) IBOutlet UIImageView *img;
@property (strong, nonatomic) IBOutlet UILabel *titlelab;
@property (strong, nonatomic) IBOutlet UILabel *pricelab;
@property (strong, nonatomic) IBOutlet UILabel *buycountlab;
@end
@implementation YYtgcell#pragma mark 重写set方法,完成数据的赋值操作
-(void)setYytg:(YYtgModel *)yytg
{_yytg=yytg;self.img.image=[UIImage imageNamed:yytg.icon];self.titlelab.text=yytg.title;self.pricelab.text=[NSString stringWithFormat:@"$%@",yytg.price];self.buycountlab.text=[NSString stringWithFormat:@"已有%@人购买",yytg.buyCount];
}+(instancetype)tgcellWithTableView:(UITableView *)tableView
{static NSString *identifier= @"tg";YYtgcell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];if (cell==nil) {//如何让创建的cell加个戳//对于加载的xib文件,可以到xib视图的属性选择器中进行设置cell=[[[NSBundle mainBundle]loadNibNamed:@"tgcell" owner:nil options:nil]firstObject];NSLog(@"创建了一个cell");}return cell;
}@end

YYfooterview.h文件

//
//  YYfooterview.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>
@class YYViewController;
@interface YYfooterview : UIView
@property(nonatomic,strong) YYViewController *controller;
@end

YYfooterview.m文件

//
//  YYfooterview.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYfooterview.h"
#import "YYViewController.h"@interface YYfooterview ()
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *loadingview;
@property (strong, nonatomic) IBOutlet UIButton *loadbtn;@end
@implementation YYfooterview
- (IBAction)loadbtclick {NSLog(@"按钮被点击了");//隐藏按钮self.loadbtn.hidden=YES;//显示菊花self.loadingview.hidden=NO;#warning 模拟发送网络请求, 3秒之后隐藏菊花dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 3.调用控制的加载数据方法
        [self.controller LoadMore];// 4.隐藏菊花视图self.loadingview.hidden = YES;// 5.显示按钮self.loadbtn.hidden = NO;});
}@end

主控制器

YYViewController.h文件

//
//  YYViewController.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>@interface YYViewController : UIViewController
//公开接口
//- (void)LoadMore;
@end

YYViewController.m文件

//
//  YYViewController.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYtgModel.h"
#import "YYtgcell.h"
#import "YYfooterview.h"@interface YYViewController ()<UITableViewDataSource,UITableViewDelegate>
@property (strong, nonatomic) IBOutlet UITableView *tableview;@property(strong,nonatomic)NSMutableArray *tg;
@end@implementation YYViewController#pragma mark-加载数据方法
-(void)LoadMore
{//创建模型YYtgModel *tgmodel=[[YYtgModel alloc]init];tgmodel.title=@"菜好上桌";tgmodel.icon=@"5ee372ff039073317a49af5442748071";tgmodel.buyCount=@"20";tgmodel.price=@"10000";//将模型添加到数组中
    [self.tg addObject:tgmodel];YYtgModel *tgmodelq=[[YYtgModel alloc]init];tgmodelq.title=@"菜好上桌1";tgmodelq.icon=@"5ee372ff039073317a49af5442748071";tgmodelq.buyCount=@"20";tgmodelq.price=@"10000";[self.tg addObject:tgmodelq];//刷新表格
    [self.tableview reloadData];
}- (void)viewDidLoad
{[super viewDidLoad];self.tableview.rowHeight=80.f;//加载底部视图//从xib中获取数据UINib *nib=[UINib nibWithNibName:@"YYfooterview" bundle:nil];YYfooterview *footerview=[[nib instantiateWithOwner:nil options:nil] firstObject];self.tableview.tableFooterView=footerview;//设置控制footerview.controller=self;
}
#pragma mark-  懒加载
-(NSArray *)tg
{if (_tg==nil) {NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];for (NSDictionary *dict in temparray) {YYtgModel *tg=[YYtgModel tgWithDict:dict];[arrayM addObject:tg];}_tg=arrayM;}return _tg;
}#pragma mark- xib创建cell数据处理#pragma mark 多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}#pragma mark多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return self.tg.count;
}#pragma mark设置每组每行
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{//1.创建cellYYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];//2.获取当前行的模型,设置cell的数据YYtgModel *tg=self.tg[indexPath.row];cell.yytg=tg;//3.返回cellreturn cell;
}#pragma mark- 隐藏状态栏
-(BOOL)prefersStatusBarHidden
{return YES;
}@end

2.通过代理完成

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

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

视图部分:

YYfooterview.h文件

//
//  YYfooterview.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>
@class YYViewController ,YYfooterview;
//约定协议
@protocol YYfooterviewDelegate <NSObject>
-(void)footerviewLoadMore;
@end@interface YYfooterview : UIView//声明一个id类型属性,遵守了协议的“人”即可成为它的代理
@property(nonatomic,strong)id<YYfooterviewDelegate> delegate;
//@property(nonatomic,strong) YYViewController *controller;
@end

YYfooterview.m文件

//
//  YYfooterview.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYfooterview.h"
#import "YYViewController.h"@interface YYfooterview ()
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *loadingview;
@property (strong, nonatomic) IBOutlet UIButton *loadbtn;@end
@implementation YYfooterview
- (IBAction)loadbtclick {NSLog(@"按钮被点击了");//隐藏按钮self.loadbtn.hidden=YES;//显示菊花self.loadingview.hidden=NO;#warning 模拟发送网络请求, 3秒之后隐藏菊花dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 3.调用控制的加载数据方法
//        [self.controller LoadMore];//通知代理(需要进行判断,代理有没有实现相应的方法)[self.delegate footerviewLoadMore];// 4.隐藏菊花视图self.loadingview.hidden = YES;// 5.显示按钮self.loadbtn.hidden = NO;});
}@end

主控制器部分

YYViewController.h文件

//
//  YYViewController.h
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>@interface YYViewController : UIViewController
//公开接口
//- (void)LoadMore;
@end

YYViewController.m文件

//
//  YYViewController.m
//  02-团购(使用xib和类完成数据展示)
//
//  Created by apple on 14-5-29.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYtgModel.h"
#import "YYtgcell.h"
#import "YYfooterview.h"@interface YYViewController ()<UITableViewDataSource,UITableViewDelegate,YYfooterviewDelegate>
@property (strong, nonatomic) IBOutlet UITableView *tableview;@property(strong,nonatomic)NSMutableArray *tg;
@end@implementation YYViewController#pragma mark-加载数据方法
-(void)footerviewLoadMore
{//创建模型YYtgModel *tgmodel=[[YYtgModel alloc]init];tgmodel.title=@"菜好上桌";tgmodel.icon=@"5ee372ff039073317a49af5442748071";tgmodel.buyCount=@"20";tgmodel.price=@"10000";//将模型添加到数组中
    [self.tg addObject:tgmodel];YYtgModel *tgmodelq=[[YYtgModel alloc]init];tgmodelq.title=@"菜好上桌1";tgmodelq.icon=@"5ee372ff039073317a49af5442748071";tgmodelq.buyCount=@"20";tgmodelq.price=@"10000";[self.tg addObject:tgmodelq];//刷新表格
    [self.tableview reloadData];
}
//-(void)LoadMore
//{
//    //创建模型
//    YYtgModel *tgmodel=[[YYtgModel alloc]init];
//    tgmodel.title=@"菜好上桌";
//    tgmodel.icon=@"5ee372ff039073317a49af5442748071";
//    tgmodel.buyCount=@"20";
//    tgmodel.price=@"10000";
//    //将模型添加到数组中
//    [self.tg addObject:tgmodel];
//    
//    YYtgModel *tgmodelq=[[YYtgModel alloc]init];
//    tgmodelq.title=@"菜好上桌1";
//    tgmodelq.icon=@"5ee372ff039073317a49af5442748071";
//    tgmodelq.buyCount=@"20";
//    tgmodelq.price=@"10000";
//    
//    [self.tg addObject:tgmodelq];
//    //刷新表格
//    [self.tableview reloadData];
//}- (void)viewDidLoad
{[super viewDidLoad];self.tableview.rowHeight=80.f;//加载底部视图//从xib中获取数据UINib *nib=[UINib nibWithNibName:@"YYfooterview" bundle:nil];YYfooterview *footerview=[[nib instantiateWithOwner:nil options:nil] firstObject];self.tableview.tableFooterView=footerview;//设置控制
//    footerview.controller=self;//设置代理footerview.delegate=self;
}
#pragma mark-  懒加载
-(NSArray *)tg
{if (_tg==nil) {NSString *fullpath=[[NSBundle mainBundle]pathForResource:@"tgs.plist" ofType:nil];NSArray *temparray=[NSArray arrayWithContentsOfFile:fullpath];NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:temparray.count];for (NSDictionary *dict in temparray) {YYtgModel *tg=[YYtgModel tgWithDict:dict];[arrayM addObject:tg];}_tg=arrayM;}return _tg;
}#pragma mark- xib创建cell数据处理#pragma mark 多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}#pragma mark多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return self.tg.count;
}#pragma mark设置每组每行
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{//1.创建cellYYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];//2.获取当前行的模型,设置cell的数据YYtgModel *tg=self.tg[indexPath.row];cell.yytg=tg;//3.返回cellreturn cell;
}#pragma mark- 隐藏状态栏
-(BOOL)prefersStatusBarHidden
{return YES;
}@end

 

转载于:https://www.cnblogs.com/yipingios/p/5549874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ublox Android 定位超时,[RK3288] [Android 7.1] u-blox GPS调试

我这里GPS使用的是TTL串口GPS芯片,用的是uart01.确认原理图对应的uart节点&#xff0c;将其打开&uart0 {status "okay";dma-names "!tx", "!rx";pinctrl-0 ;};2.在hal层编译出 gps.default.so 目录在hardware/rockchip/gps/有的目录下自带…

1.4Activity保存现场状态

概念: 保存Activity的状态是非常重要的&#xff0c;例如我们在玩一个游戏的时候&#xff0c;突然来了一个电话&#xff0c;这个时候在接听完电话之后我们返回到游戏中&#xff0c;这个时候我们希望游戏还是之前那个进度&#xff0c;或者说发生突发事件&#xff0c;游戏这个应用…

鸿蒙系统什么时候超过苹果,为何任正非说鸿蒙系统想超过苹果系统需要的时间,不会超过300年...

还记得任正非的一段话&#xff1a;华为操作系统要想超安卓苹果&#xff0c;需要很长时间&#xff0c;但不会超过 300 年。我相信这段话并不是说华为系统要超过苹果手机&#xff0c;需要300年的时间。任正非只是解释了华为系统目前和安卓系统以及苹果系统还有一定的差距&#xf…

android开发设计平台,10款开发和设计应该安装的android应用

过去几年里有很多新开发的小工具出现&#xff0c;人们的生活越来越离不开智能机&#xff0c;当然包括android手机&#xff0c;它已经成为了人们的最大需求量之一&#xff0c;市场上出现的android手机也越来越多&#xff0c;人们也比较喜欢用andorid手机。因为相对而言&#xff…

html的div显示到最左侧,HTML/CSS:如何淡化div的左右边缘?

嗨&#xff0c;我想淡出div和它的内容从左和右边缘使用纯CSS。 目前&#xff0c;我能够根据一个关于堆栈溢出的问题的答案来实现这一点。null.container {height: 234px;width: 234px;overflow: scroll;mask-image: linear-gradient(transparent,black 20%,black 80%,transpare…

android 微积分计算器,高数计算器1.0(高数计算工具app)

高数计算器1.0是手机上的一款免费好用的高数计算工具app&#xff0c;利用它&#xff0c;用户就可以进行快速进准的高等数学计算操作&#xff0c;范围包涵函数偏导、泰勒展开、一重积分、二重积分以及Latex编辑等等。详细内容请感兴趣的朋友前来西西下载体验&#xff01;应用简介…

教你搞定Android自定义View

Android App开发过程中&#xff0c;很多时候会遇到系统框架中提供的控件无法满足我们产品的设计需求&#xff0c;那么这时候我们可以选择先Google下有没有比较成熟的开源项目可以让我们用&#xff0c;当然现在Github上面的项目非常丰富&#xff0c;能够满足我们绝不多数的开发需…

将游戏成绩传到排名页面html,用野狗开发实时游戏排行榜

创建wilddog应用填写应用名称和应用ID就可以创建了。应用ID需要全网唯一创建成功之后就可以在控制面板看到应用了.1.引入SDK2.创建引用ref Wilddog("https://.wilddogio.com/")//将替换成申请的应用IDref Wilddog("https://fullstack-top-demo.wilddogio.com/…

波士顿大学计算机与传媒专业,波士顿大学传媒专业好吗

波士顿大学传媒专业是美国历史上最早的可以授予公共关系学位的大学&#xff0c;它是世界历史上培养得最多的公共关系学者的一所学校。在美国所有新闻传媒专业的排名来讲&#xff0c;波士顿大学传媒专业全美排名也是在前10名的&#xff0c;而在全世界的排名上则是位于前50名的超…

html5 deckview,六本木Hills出現超大型巨人?進擊的巨人展FINAL×頂樓Sky Deck的VR體驗...

戶外複合型度假區「相模湖森林度假遊樂園」將從2019年7月20日(六)&#xff5e;8月30日(五)這段期間展開超人氣動畫《進擊的巨人》與超人氣競技設施「MUSCLE MONSTER」的合作企劃「進擊的企劃『MUSCLE MONSTER』」活動&#xff01;這次的活動是為了紀念7月5日(五)&#xff5e;9月…

surface系列平板电脑属于微型计算机,什么是Surface平板电脑 微软的Surface平板电脑泽怎么样...

什么是Surface平板电脑?微软的Surface平板电脑是什么?Surface平板电脑分两个版本一个是运行Windows RT系统&#xff0c;搭载ARM处理器(类似于大多手机和平板电脑)&#xff0c;9.3毫米(比iPad薄一点)&#xff0c;676g(比iPad重一点)&#xff0c;配有10.6英寸ClearType高清显示…

用户注意到用户计算机中千兆位网卡,为何你电脑上的千兆网卡跑不到千兆?

这几天谈了不少网络方面的知识和教程&#xff0c;基本上已经脱离百兆的温饱线&#xff0c;走向了高大上的千兆小康生活……事实上&#xff0c;对于目前的硬件环境而言&#xff0c;无论是路由器、网卡、光纤、网线&#xff0c;仅从带宽而言&#xff0c;达到千兆毫无难度&#xf…

安卓学习日记:初识Android Studio · java环境配置和AS安装

工欲善其事&#xff0c;必先利其器。要进行安卓开发&#xff0c;必须要有一款上手的开发利器。查阅了相关资料后&#xff0c;了解到&#xff0c;现在主流的安卓开发工具是&#xff1a; 1. Eclipse Android SDK 2. Android Studio 因为安卓的开发语言是 java&#xff0c;所以…

sql 递归查询

1、既然要谈到sql&#xff0c;数据库表是必须的 2、数据结构 3、获取某个节点的所有子节点 传统的写法&#xff08;sql2000&#xff09; 很麻烦&#xff0c;暂且就不写了 来看看CTE的写法 CREATE PROC sp_getTreeById(TreeId int) AS BEGIN WITH cteTree AS (SELECT * FROM Tuz…

计算机画画教程,【推荐】初学者电脑画画教程

电脑绘画教程&#xff0c;今天跟大家分享一下&#xff0c;如何学电脑绘画以及关于零基础学板绘是不是一定要美术基础的问题~~这也是很多学习电脑绘画小伙伴的疑虑。如果你想快速提升自己的绘画水平&#xff0c;并且绝对的不怕辛苦&#xff0c;欢迎挑战轻微课魔鬼特训班&#xf…

python 中调用shell命令

subprocess模块 根据Python官方文档说明&#xff0c;subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh&#xff0c;代码很简短&#xff0c;不过很有意思&#xff0c;它在线程中调用subprocess启动子进程来干活。 [python] view plaincopy >>&…

一台计算机数据丢失与恢复,如何在不丢失数据的情况下将iPhone与多台计算机同步-万兴数据恢复-万兴恢复专家...

第2部分&#xff1a;将iPhone与多台计算机与iTunes同步如果用户对iPhone有很强的控制欲&#xff0c;并且不想尝试使用任何新软件来同步需求&#xff0c;那么iTunes也可用于将iPhone与多台计算机同步。虽然在第一时间&#xff0c;这可能听起来和iTunes的职能相悖&#xff0c;但实…

iOS OC语言: Block底层实现原理

来源http://www.wtoutiao.com/p/11dgbk4.html 先来简单介绍一下Block Block是什么&#xff1f; 苹果推荐的类型&#xff0c;效率高&#xff0c;在运行中保存代码。用来封装和保存代码&#xff0c;有点像函数&#xff0c;Block可以在任何时候执行。 Block和函数的相似性&#xf…

计算机如何取消还原卡,如何关闭硬件还原卡?

2009-11-06有什么方法可以让电脑每次关机都可以自动删1)打开控制面板/性能维护/管理工具/双击本地安全策略&#xff0c;在右侧选“关机清理虚拟内存页面文件”双击他选“已启用”按应用重启即可。2)建议下载超级兔子是免费的小巧著名的软件&#xff0c;选择清理系统垃圾(全选)&…

服务器虚拟主机推荐,免费的虚拟主机推荐

写在前面&#xff1a;免费虚拟主机免费虚拟主机是指IDC服务商“免费”为站长提供网页寄存服务。免费虚拟主机--用于制作免费个人网站&#xff0c;是学习网页设计的好方法。虚拟主机就是指网站空间&#xff0c;是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等&…