UITableView使用及TableViewCell的复用机制
来源:互联网 发布:淘宝代运营服务商 编辑:程序博客网 时间:2024/05/21 07:55
UI第十一天----UITableView
一、系统自带的UITable使用方法
1.首先要在.h文件中包含(要显示需要将其设置为根视图来显示)UITableViewDataSource,UITableViewDelegate这两个协议。
//dataSource是控制显示内容的协议,里面的方法都为这个服务;delegate是控制交互的协议,里面的方法都为这个服务
//UISCrollView及其家族成员出现时,别忘了下面这句(除非你用了自动布局)
2.关闭自动调整高度方法
self.automaticallyAdjustsScrollViewInsets= NO;
UITableView *table = [[UITableView alloc]initWithFrame:CGRectMake(0, 64,320, self.view.frame.size.height-64)style:UITableViewStyleGrouped];
[self.view addSubview:table];
[table release];
table.dataSource = self;
table.delegate = self;
table.backgroundColor = [UIColor greenColor];
//设置table的行与行之间的分隔线。这里设置为没。
3.将分隔线设置为无。
table.separatorStyle = UITableViewCellSeparatorStyleNone;
4. 设置这个table一共有多少段,如果不设置这个代理方法,默认就是1段。
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
{
//return多少就有几行。
return 3;
}
5. 告诉我们这个table的对应段一共有几行,
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
[super didReceiveMemoryWarning];
//这里的参数section,表示这里的段。
NSLog(@"%d",section);
//表示我们的table有4行。
// return 3;
//每一段的行数不一定非要一样,下面设置法可以控制每一段行数。默认为平均行数。
if(section == 0)
{
return 0;
}else if (section == 1)
{
return 1;
}
else
{
return 3;
}
}
6.下面方法中写每一行显示的内容,这种cell的用法不合适,只为举例:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//tableView这个参数表示正在被控制的table。
//这里的参数indexPath可以找到我们所在的段,也可以找到我们所在的行。
int section = [indexPath section];//当前段
int row = [indexPath row];//当前行
//每一段里面的行数都是从0开始的,
NSLog(@"这是第%d段的%d行",section,row);
//实例化了一个UITableViewCell的对象,这个对象,就是table的一行。他的功能就是作为这一行上显示的内容的父视图(在这个cell上addSubView)。
UITableViewCell *cell = [[UITableViewCell alloc] init];
//cell自带文本属性
//cell.textLabel.text = [NSStringstringWithFormat:@"%d--%d",[indexPath section],[indexPath row]];
if([indexPath section]==0)
{
cell.textLabel.text = @"pp";
}
if([indexPath section]==1)
{
cell.textLabel.text = @"qq";
}
if([indexPath section]==2)
{
NSArray *tempArr = @[@"我",@"是",@"谁"];
cell.textLabel.text = tempArr[indexPath.row] ;
//把所在行数与数组联系起来。
//注意数组长度不能小于行数,不然会越界。
}
//cell自带的图片属性。
cell.imageView.image=[UIImage imageNamed:@"0_s.png"];
//设置cell的选中效果,这里设置为没效果。
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
7.两个必须实现的方法。
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
二、真正的tableView,可以实现复用的tableView。
1.同样先在.h文件中包含两个协议。并且声明一个全局的可变数组:
@property(nonatomic,retain)NSMutableArray *dataArr;
2.创建数据源,保存到可变数组。
Eg:
//创建数据源
for(int i = 0;i<20;i++)//table同时加载一页的最多行数。
{
[self.dataArraddObject:[NSDictionarydictionaryWithObjectsAndKeys:[NSStringstringWithFormat:@"第%d本书",i+1],@"title",[NSStringstringWithFormat:@"¥%d",i+10],@"price",nil]];
//长度为20的数组,每一个元素都是一个字典,每个字典都有相同的两个key,一个是title,一个是price,value都是字符串。
}
3.创建视图
-(void)makeMainView
{
UITableView *table = [[UITableViewalloc]initWithFrame:CGRectMake(0,64,320,self.view.frame.size.height-64)style:UITableViewStylePlain];
table.dataSource =self;
table.delegate =self;
[self.viewaddSubview:table];
[table release];
}
//返回行数
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
{
returnself.dataArr.count;
}
重点:下面模式为固定的。
-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//UITableViewCell的复用
staticNSString *iden =@"iden";//字符串变量名和等号后面的常量都可随意,但要有意义。准备一个标识
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:iden];//给这个tableview注册这个标识。,从此等号前的cell对象就用这个iden在tableView里挂号了。
if(cell==nil)//判空(就是当你想用cell的时候,发现cell不够用了,够用就不进if,if后面直接用)
{
//不够用,就创建新的。
cell = [[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:iden]autorelease];//记得release。
}
/*
所谓复用
1、我们只实例化屏幕显示所需的最大的个数
2、当一个cell滚出屏幕时,这个cell会被扔进cell池里面
3、当一个cell滚进屏幕时,回去cell池里面找是否有被扔进来的,如果找到了,就是用这个找到的cell(并把cell上之前的内容清空),如果没有找到,则实例化一个新的cell。
4、这种,使用之前创建好了cell的行为,就叫cell的复用。
*/
for(id temp in cell.contentView.subviews)//找到cell的contentView上面原来所有子视图。
{
[temp removeFromSuperview];
}
UIImageView *image = [[UIImageViewalloc]initWithFrame:CGRectMake(10,5,34,34)];
image.backgroundColor = [UIColorredColor];
//可以吧各种UIView添加到cell上面。
在ios6之前,可以直接添加到cell上,之后我们需要添加到cell.contentView上
//所以干脆就往cell.contentView上面添得了
[cell.contentViewaddSubview:image];
[image release];
//下面的视图控件为需要展示到每一行的东西。
UILabel *title = [[UILabelalloc]initWithFrame:CGRectMake(50,0,200,25)];
title.text = [NSStringstringWithFormat:@"这是第%d行",indexPath.row];
[cell.contentViewaddSubview:title];
[title release];
UILabel *price = [[UILabelalloc]initWithFrame:CGRectMake(50,25,200,19)];
price.text = [NSStringstringWithFormat:@"¥%d",6];
[cell.contentViewaddSubview:price];
[price release];
return cell;
}
//在此方法之下的诸多方法:
//设置每行多高的,瀑布流的时候每行高度应该是不一样的,随内容变化,一些固定布局,可以全一样高。默认44.
-(CGFloat)tableView:(UITableView *)tableViewheightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return80;
}
//当某一行被点击的时候触发
-(void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"我将要去的页面的数据会从数组中的第%d的元素里取得",indexPath.row);
}
//设置每一段段头的文本内容,如果一个短只有一个文本内容的话,可以选择使用这个。
//-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
//{
// return @"第一段";
//
//}
//设置每一段段头的视图,如果每一段的段头比较丰富的时候(有按钮、图片、label。。。),可以选择使用这个。
-(UIView *)tableView:(UITableView *)tableViewviewForHeaderInSection:(NSInteger)section
{
UIView *view= [[UIViewalloc]initWithFrame:CGRectMake(100,0,100,20)];//不可控制frame
view.backgroundColor = [UIColorbrownColor];
// return [view autorelease ];
UILabel *label = [[UILabelalloc]initWithFrame:CGRectMake(50,0,60,20)];
label.text =@"头";
[view addSubview:label];//这样就可以控制frame。
return [viewautorelease];
}
//设置段头高度。
-(CGFloat)tableView:(UITableView *)tableViewheightForHeaderInSection:(NSInteger)section
{
return50;
}
//当一个已经被选中了的行,被取消选中时,触发。
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"第%d个被取消选中了",indexPath.row);
}
典例:如下图所示每一个table的cell里面有两个被点击的东西的实现:前期工作同上介绍。
.m文件中的主要方法:
- (void)viewDidLoad
{
self.muArr = [NSMutableArrayarrayWithCapacity:0];
self.automaticallyAdjustsScrollViewInsets = NO;
[superviewDidLoad];
[self loadData];
[selfmakeMainView];
//做一个有3段,3行的table。每一个上又两个BTN
// Do any additional setup after loading theview, typically from a nib.
}
-(void)loadData
{
for(int i =0;i<3;i++)
{
NSDictionary *dic = [NSDictionarydictionaryWithObjectsAndKeys:[NSStringstringWithFormat:@"%d",arc4random()%10],@"btn",[NSStringstringWithFormat:@"第%d行",i] ,@"label",nil];
[self.muArraddObject:dic];
}
NSLog(@"%@",self.muArr);
}
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
{
return [self.muArrcount];
}
-(void)makeMainView
{
UITableView *table = [[UITableViewalloc]initWithFrame:CGRectMake(0,64,320,self.view.frame.size.height-64)style:UITableViewStyleGrouped];
table.dataSource =self;
table.delegate =self;
[self.viewaddSubview:table];
[table release];
}
//核心代码:
-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{
staticNSString *iden =@"iden";
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:iden];
if(cell==nil)
{
cell = [[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:iden]autorelease];
}
for(id temp in cell.contentView.subviews)
{
[temp removeFromSuperview];
}
//从数组中,根据当前行数对应下表吧数组里存的对应字典取出来。这个字典就是这一行要显示的内容。
// NSDictionary *dicHere = self.muArr[indexPath.row];
UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
btn.frame =CGRectMake(10,5,34,34);
[btn setTitle:@"左"forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(btnDown:)forControlEvents:UIControlEventTouchUpInside];
btn.tag =1000+indexPath.row*2+100*indexPath.section;
//被标记为黑的tag设置方式出来每一段的tag值都会不一样。依次为1001,1002,1003 / 1101,1102,1103 / 1201,1202,1203
NSLog(@"%d",btn.tag);
[cell.contentViewaddSubview:btn];
UILabel *label = [[UILabelalloc]initWithFrame:CGRectMake(50,25,60,19)];
label.text =@"左" ;
[cell.contentViewaddSubview:label];
[label release];
UIButton *btn1 = [UIButtonbuttonWithType:UIButtonTypeRoundedRect];
btn1.frame =CGRectMake(200,5,60,20);
[btn1 setTitle:@"右"forState:UIControlStateNormal];
[btn1 addTarget:selfaction:@selector(btnDown:)forControlEvents:UIControlEventTouchUpInside];
[cell.contentViewaddSubview:btn1];
btn1.tag =1000+indexPath.row*2+1+100*indexPath.section;
NSLog(@"%d",btn1.tag);
UILabel *label1 = [[UILabelalloc]initWithFrame:CGRectMake(200,25,60,19)];
label1.text =@"右";
[cell.contentViewaddSubview:label1];
[label1 release];
return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return3;
}
-(void)btnDown:(UIButton *)btn
{
NSLog(@"下面进入对应这个值的大数组里的第%d小数组的第%d个元素",(btn.tag-1000)/100,(btn.tag-1000)%100);
}
x源码下载:点击打开链接
- UITableView使用及TableViewCell的复用机制
- 使用自定义的tableViewCell- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS
- TableViewCell注册及复用
- UITableview中cell的复用机制
- tableViewCell的复用方法
- 解决tableviewCell覆盖的问题以及tableviewCell复用原理
- UITableView的介绍及使用
- 关于TableViewCell的重用机制
- iOS开发笔记>> 简述UItableView 的复用机制
- iOS开发之UI学习-UITableView的复用机制
- iOS隐藏UITableview下面多余的tableviewcell的线条
- Storyboard 下 TableViewCell的复用
- 自定义tableViewCell 的复用问题
- TableViewCell内含textField的复用
- iOS UITableView(十) tableViewcell内容重复的解决办法
- iphone UITableView及UIWebView的使用
- iphone UITableView及UIWebView的使用
- iOS TableViewCell的使用总结
- hihocoder 状态压缩二
- Java 学习笔记--解决一个类实现多个接口的问题
- 桥接模式(Bridge)
- UITabBar
- 遍历驱动设备栈
- UITableView使用及TableViewCell的复用机制
- 原理:数据结构-索引 && 应用篇:MySQL索引背后的数据结构及算法原理详解
- 如何在Myeclipse中安装middleGenIDE
- canvas
- Unable to post the review. &&The user specified as a definer ('admin'@'localhost') does not exist
- 各种 Java Thread State 第一分析法则
- poj 1122 FDNY to the Rescue!
- 手把手教大家如何在CSDN博客中插入图片
- 关于Interface中定义变量的注意事项