iOS開發UI篇—在UITableview中實現加載更多功能

1、實現效果數組

點擊加載更多按鈕,出現一個加載圖示,三秒鐘後添加兩條新的數據。網絡

                    

 

2、實現代碼和說明app

當在頁面(視圖部分)點擊加載更多按鈕的時候,主頁面(主控制器)會加載兩條數據進來。ide

視圖部分的按鈕被點擊的時候,要讓主控制器加載數據,刷新表格,2B青年會在視圖中增長一個主控制器的屬性,經過這個屬性去調用進行加載,但在開發中一般經過代理模式來完成這個操做。atom

下面分別是兩種實現的代碼。spa

一、項目結構和說明3d

說明:加載更多永遠都放在這個tableview的最下端,所以這裏設置成了這個tableview的tableFooterView。代理

 self.tableview.tableFooterView=footerview;code

在實現上經過xib來進行處理,考慮到左右的留白,以及點擊後的要切換到加載按鈕和文字,要同時控制圖標和文字,所以把加載圖標和文字提示放在了一個view中以便控制,這個xib已經和YYfooterview.xib進行了關聯,經過這個類來控制xib。orm

二、實現代碼

(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.建立cell
YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];

//2.獲取當前行的模型,設置cell的數據
YYtgModel *tg=self.tg[indexPath.row];
cell.yytg=tg;

//3.返回cell
return 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.建立cell
YYtgcell *cell=[YYtgcell tgcellWithTableView:tableView];

//2.獲取當前行的模型,設置cell的數據
YYtgModel *tg=self.tg[indexPath.row];
cell.yytg=tg;

//3.返回cell
return cell;
}

#pragma mark- 隱藏狀態欄
-(BOOL)prefersStatusBarHidden
{
return YES;
}

@end

複製代碼
相關文章
相關標籤/搜索