zoukankan      html  css  js  c++  java
  • IOS之UITableView详解(2)

      1 UITableView
      2 UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped
      3 
      4 <UITableViewDataSource,UITableViewDelegate>里的方法:
      5 tableView处理步骤
      6 #pragma mark 1.有多少组
      7 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      8 #pragma mark 2.第section组头部控件有多高
      9 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
     10 #pragma mark 3.第section组有多少行
     11 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     12 #pragma mark 4.indexPath这行的cell有多高
     13 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     14 #pragma mark 5.indexPath这行的cell长什么样子
     15 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     16 #pragma mark 6.第section组头部显示什么控件
     17 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
     18 
     19 
     20 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     21 
     22 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     23 
     24 //每当有一个cell进入视野屏幕就会调用,所以在这个方法内部就需要优化。
     25 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     26 if(cell==nil){
     27      //在这里面做创建的工作。循环优化。防止刷新cell进入屏幕的时候重复的创建
     28 } 
     29 }
     30 
     31 //当调用reloadData的时候,会重新刷新调用数据源内所有方法,其他事情都不会做呀
     32  [self reloadData]
     33 
     34  //这个方法只有在一开始有多少条数据才会算多少个高度,这个方法只会调用一次,但是每次reloadData的时候也会调用
     35  //而且会一次性算出所有cell的高度,比如有100条数据,一次性调用100次
     36 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     37 
     38 
     39 
     40 
     41 -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView //右侧索引
     42 
     43     -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath //行点击事件
     44 
     45 NSIndexPath *path = [self.tableView indexPathForSelectedRow]; //获得被选中的indexPath可以得到section,row
     46   
     47 [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationNone]; //刷新table指定行的数据
     48          
     49    [self.tableView reloadData]; //刷新table所有行的数据
     50 
     51 
     52 UITableView常用属性:
     53     UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain]; // 初始化表格
     54     分隔线属性 
     55 tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; //UITableViewCellSeparatorStyleNone;
     56 [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; //取消分隔线
     57     tableView.separatorColor = [UIColor lightGrayColor];
     58     
     59     条目多选
     60 tableView.allowsMultipleSelection = YES;
     61      
     62     // 设置标题行高
     63 [_tableView setSectionHeaderHeight:kHeaderHeight];
     64     [_tableView setSectionFooterHeight:0];
     65 
     66     // 设置表格行高
     67  [_tableView setRowHeight:50];
     68 
     69 //设置背景色
     70 self.tableView.backgroundView  优先级高,如果要设置backgroundColor的时候要先把view设置为nil
     71 self.tableView.backgroundColor
     72 
     73 //在tableView的头部或者尾部添加view,footerView宽度是不用设置的
     74        xxxView.bounds = CGRectMake(0,0,0,height); 
     75     self.tableView.tableFooterView =xxxView;
     76        self.tableView.tableHeaderView =xxxView;
     77 
     78 UIButton *bt = (UIButton*)[self.contentView viewWithTag:i+100];
     79  
     80 增加tableview滚动区域
     81 self.tableView.contentInset = UIEdgeInsetsMake(0, 0, xx, 0);  
     82 UITableViewCell
     83 //创建UITableViewCell         
     84 UITableViewCell *cell = [[UITableViewCell alloc]
     85 initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
     86         
     87     [cell.textLabel setBackgroundColor:[UIColor clearColor]];// 清空标签背景颜色 
     88         
     89         cell.backgroundView =xx; //设置背景图片
     90         cell.backgroundVColor =xx;
     91         cell.selectedBackgroundView = selectedBgView; //设置选中时的背景颜色
     92 
     93        
     94    cell.accessoryView = xxxView; //设置右边视图
     95    [cell setAccessoryType:UITableViewCellAccessoryNone]; //设置右侧箭头    
     96  
     97 [self setSelectionStyle:UITableViewCellSelectionStyleNone]; //选中样式
     98 cell.selectionStyle = UITableViewCellSelectionStyleBlue;
     99 
    100 //设置cell的高度
    101 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    102 
    103 contentView下默认有3个子视图,其中的2个是UILabel,通过textLabel和detailTextLabel属性访问,第3个是UIImageView,通过imageView属性访问.
    104   UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle
    105   
    106 #pragma mark - 重新调整UITalbleViewCell中的控件布局
    107 - (void)layoutSubviews{ 
    108 [super layoutSubviews];
    109 110 } 
    111 cell 里面还有一个contentView
    112 UITableViewCell表格优化
    113 UITableViewCell对象的重用原理:
    114 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
    115 还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell(如短信聊天布局),所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,时可能会得到错误类型的UITableViewCell那么UITableView在重用UITableViewCell。解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象
    116 
    117 /**
    118 单元格优化
    119  1. 标示符统一,使用static的目的可以保证表格标示符永远只有一个
    120  2. 首先在缓冲池中找名为"myCell"的单元格对象
    121  3. 如果没有找到,实例化一个新的cell
    122  **/
    123 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    124     static NSString *cellIdentifier = @"myCell";
    125 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    126 //使用这种方法不用判断下面的cell
    127     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    128     if (cell == nil) {        
    129         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    130     }
    131 return cell;
    132 }
    133 
    134 表格的编辑模式
    135 删除、插入 
    136 - (void)setEditing:(BOOL)editing animated:(BOOL)animated;  开启表格编辑状态 
    137 
    138 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    139     返回表格编辑编辑样式。不实现默认都是删除
    140 return editingStyle : UITableViewCellEditingStyleDelete, UITableViewCellEditingStyleInsert
    141 }
    142 
    143 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    144       //根据editingStyle处理是删除还是添加操作
    145       完成删除、插入操作刷新表格
    146 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    147 
    148 -(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    149 }
    150 
    151 移动
    152 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
    153 sourceIndexPath 移动的行    
    154 destinationIndexPath 目标的行
    155 
    156 自定义表格行UITableViewCell
    157 storyboard方式创建:
    158 直接拖到UITableView里面设置UITableViewCell
    159 注意:
    160 1.通过XIB或者Storyboard自定义单元格时,在xib和Storyboard里面需要指定单元格的可重用标示符Identifier
    161 
    162 2.注意表格的优化中的差别
    163 在Storyboard中两者等效
    164 xxCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    165 xxCell *cell1 = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    166 
    167 在xib文件中有差别:
    168 第一种情况,只能在iOS 6以上使用,如果在viewDidLoad注册了nib文件,并且指定了“单元格”的可重用标示符,那么     
    169      dequeueReusableCellWithIdentifier:
    170      dequeueReusableCellWithIdentifier:forIndexPath:
    171      方法是等效的。如果在viewDidLoad中注册了nib文件,表格缓冲池中的管理,有系统接管!
    172 
    173 第二种情况,是在iOS 4以上均可以使用,如果没有在viewDidLoad注册nib文件,那么,只能使用
    174      dequeueReusableCellWithIdentifier:并且需要判断cell没有被实例化,并做相应的处理
    175 
    176   
    177 在代码创建中差别:
    178 用代码创建cell中的处理和nib一样,注册了cell就有系统接管并且可以用带forIndexPath的方法,没有注册就要自己去实例化cell,不能用带forIndexPath的方法
    179 [tableView registerClass:XxxCell class] forCellReuseIdentifier:@"xxCell"];
    180 
    181 xib方式创建:
    182 //注册Identifier 
    183 - (void)viewDidLoad{
    184     [super viewDidLoad];
    185     /**
    186      注意:以下几句注册XIB的代码,一定要在viewDidLoad中!
    187      注册XIB文件,获得根视图,并且转换成TableView,为tableView注册xib
    188      Identifier名要在xib文件中定义,并且保持一致
    189      **/
    190     UINib *nib = [UINib nibWithNibName:@"BookCell" bundle:[NSBundle mainBundle]];
    191     UITableView *tableView = (UITableView *)self.view;
    192     [tableView registerNib:nib forCellReuseIdentifier:@"bookCell"];    
    193 }
    194 
    195 //没有注册Identifier只能使用下面方法
    196 static NSString *CellIdentifier = @"bookCell";
    197 BookCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    198 if (cell == nil) { 
    199         cell = [[BookCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    200         NSBundle *bundle = [NSBundle mainBundle];
    201         NSArray *array = [bundle loadNibNamed:@"BookCell" owner:nil options:nil];
    202         cell = [array lastObject];
    203     }
    204 
    205 
    206 代码方式创建:
    207 1.    建立UITableViewCell的类,继承UITableViewCell
    208 2.    往cell里面加入view的时候注意点:
    209 //新建的组件放入contentView中
    210 [self.contentView addSubview:xxView]; 
    211 
    212 //设置图片拉伸属性stretch
    213 UIImage *normalImage = [UIImage imageNamed:@"xx.png"];
    214 normalImage = [normalImage stretchableImageWithLeftCapWidth:
    215 normalImage.size.width / 2 topCapHeight:normalImage.size.height / 2];
    216 
    217 //在tableView里面viewDiDLoad里面要注册cell类
    218 [tableView registerClass:XxxCell class] forCellReuseIdentifier:@"xxCell"];
    219 
    220 自定义表格中Header
    221 //自定义表格在这个方法中定义
    222 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    223 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  • 相关阅读:
    稳扎稳打Silverlight(13) 2.0交互之鼠标事件和键盘事件
    稳扎稳打Silverlight(17) 2.0数据之详解DataGrid, 绑定数据到ListBox
    再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) Entity Framework(实体框架)之详解 Linq To Entities 之一
    稳扎稳打Silverlight(8) 2.0图形之基类System.Windows.Shapes.Shape
    稳扎稳打Silverlight(11) 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画
    稳扎稳打Silverlight(21) 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应
    稳扎稳打Silverlight(16) 2.0数据之独立存储(Isolated Storage)
    稳扎稳打Silverlight(9) 2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    稳扎稳打Silverlight(23) 2.0通信之调用WCF的双向通信(Duplex Service)
    游戏人生Silverlight(1) 七彩俄罗斯方块[Silverlight 2.0(c#)]
  • 原文地址:https://www.cnblogs.com/changxs/p/4045838.html
Copyright © 2011-2022 走看看