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);

   

   //表示我们的table4行。

   //  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的一行。他的功能就是作为这一行上显示的内容的父视图(在这个celladdSubView)。

   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,一个是pricevalue都是字符串。

   

   }

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对象就用这个identableView里挂号了。

   if(cell==nil)//判空(就是当你想用cell的时候,发现cell不够用了,够用就不进ifif后面直接用)

   {

       //不够用,就创建新的。

       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)//找到cellcontentView上面原来所有子视图。

    {

       [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);

 

}

 

 

 

典例:如下图所示每一个tablecell里面有两个被点击的东西的实现:前期工作同上介绍。

QFDisk:Users:qianfeng:Desktop:屏幕快照 2014-08-18 19.01.58.png

.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值都会不一样。依次为100110021003 / 110111021103 / 120112021203

   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源码下载:点击打开链接

0 0