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.dataArr addObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"第%d本书",i+1],@"title",[NSString stringWithFormat:@"¥%d",i+10],@"price", nil]];
//长度为20 的数组,每一个元素都是一个字典,每个字典都有相同的两个key,一个是title,一个是price,value都是字符串。
}
3.创建视图
-(void)makeMainView
{
UITableView *table = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, 320, self.view.frame.size.height-64)style:UITableViewStylePlain];
table.dataSource = self;
table.delegate = self;
[self.view addSubview:table];
[table release];
}
//返回行数
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
{
return self.dataArr.count;
}
重点:下面模式为固定的。
-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//UITableViewCell的复用
static NSString *iden = @"iden";//字符串变量名和等号后面的常量都可随意,但要有意义。准备一个标识
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:iden];//给这个tableview注册这个标识。,从此等号前的cell对象就用这个iden在tableView里挂号了。
if(cell== nil)//判空(就是当你想用cell的时候,发现cell不够用了,够用就不进if,if后面直接用)
{
//不够用,就创建新的。
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: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 = [[UIImageView alloc]initWithFrame:CGRectMake(10, 5, 34, 34)];
image.backgroundColor = [UIColor redColor];
//可以吧各种UIView添加到cell上面。
在ios6之前,可以直接添加到cell上,之后我们需要添加到cell.contentView上
//所以干脆就往cell.contentView上面添得了
[cell.contentView addSubview:image];
[image release];
//下面的视图控件为需要展示到每一行的东西。
UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(50, 0, 200, 25)];
title.text = [NSString stringWithFormat:@"这是第%d行",indexPath.row];
[cell.contentView addSubview:title];
[title release];
UILabel *price = [[UILabel alloc] initWithFrame:CGRectMake(50, 25, 200, 19)];
price.text = [NSString stringWithFormat:@"¥%d",6];
[cell.contentView addSubview:price];
[price release];
return cell;
}
//在此方法之下的诸多方法:
//设置每行多高的,瀑布流的时候每行高度应该是不一样的,随内容变化,一些固定布局,可以全一样高。默认44.
-(CGFloat)tableView:(UITableView *)tableViewheightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}
//当某一行被点击的时候触发
-(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= [[UIView alloc]initWithFrame:CGRectMake(100, 0, 100, 20)];//不可控制frame
view.backgroundColor = [UIColor brownColor];
// return [view autorelease ];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(50, 0, 60, 20)];
label.text = @"头";
[view addSubview:label];//这样就可以控制frame。
return [view autorelease];
}
//设置段头高度。
-(CGFloat)tableView:(UITableView *)tableViewheightForHeaderInSection:(NSInteger)section
{
return 50;
}
//当一个已经被选中了的行,被取消选中时,触发。
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"第%d个被取消选中了",indexPath.row);
}
典例:如下图所示每一个table的cell里面有两个被点击的东西的实现:前期工作同上介绍。
.m文件中的主要方法:
- (void)viewDidLoad
{
self.muArr = [NSMutableArray arrayWithCapacity:0];
self.automaticallyAdjustsScrollViewInsets = NO;
[super viewDidLoad];
[self loadData];
[self makeMainView];
//做一个有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 = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d",arc4random()%10],@"btn",[NSString stringWithFormat:@"第%d行",i] ,@"label",nil];
[self.muArr addObject:dic];
}
NSLog(@"%@",self.muArr);
}
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section
{
return [self.muArr count];
}
-(void)makeMainView
{
UITableView *table = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, 320, self.view.frame.size.height-64)style:UITableViewStyleGrouped];
table.dataSource = self;
table.delegate = self;
[self.view addSubview:table];
[table release];
}
//核心代码:
-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *iden = @"iden";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:iden];
if(cell== nil)
{
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:iden] autorelease];
}
for(id temp in cell.contentView.subviews)
{
[temp removeFromSuperview];
}
//从数组中,根据当前行数对应下表吧数组里存的对应字典取出来。这个字典就是这一行要显示的内容。
// NSDictionary *dicHere = self.muArr[indexPath.row];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(10, 5, 34, 34);
[btn setTitle:@"左" forState:UIControlStateNormal];
[btn addTarget:self action:@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.contentView addSubview:btn];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 25,60, 19)];
label.text = @"左" ;
[cell.contentView addSubview:label];
[label release];
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame = CGRectMake(200, 5, 60, 20);
[btn1 setTitle:@"右" forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(btnDown:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:btn1];
btn1.tag = 1000+indexPath.row*2+1+100*indexPath.section;
NSLog(@"%d",btn1.tag);
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(200, 25, 60, 19)];
label1.text = @"右";
[cell.contentView addSubview:label1];
[label1 release];
return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
-(void)btnDown:(UIButton *)btn
{
NSLog(@"下面进入对应这个值的大数组里的第%d小数组的第%d个元素",(btn.tag-1000)/100,(btn.tag-1000)%100);
}
x源码下载:点击打开链接