zoukankan      html  css  js  c++  java
  • iOS-UI控件之UITableView(一)

    UITableView

    介绍

    • UITableView 是用来用列表的形式显示数据的UI控件
      • 举例
      • QQ好友列表
      • 通讯录
      • iPhone设置列表

    tableView 常见属性

        // 设置每一行cell的高度
        self.tableView.rowHeight = 100;
    
        // 设置每一组头部的高度
        self.tableView.sectionHeaderHeight = 50;
    
        // 设置每一组尾部的高度
        //    self.tableView.sectionFooterHeight = 50;
    
        // 设置分割线颜色
        self.tableView.separatorColor = [UIColor redColor];
        // 设置分割线样式
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        // 设置表头控件
        self.tableView.tableHeaderView = [[UISwitch alloc] init];
        // 设置表尾控件
        self.tableView.tableFooterView = [UIButton buttonWithType:UIButtonTypeContactAdd];
    

    UITableView的两种样式只读属性

    • 只读属性,在代码中不能修改
      UITableViewStylePlain
    • 一组显示Section = 1;
    UITableViewStyleGrouped
    • 分组显示Section >= 1;

    展示数据

    遵守协议
    • UITableViewDataSource
    设置数据源
    • 连线
    • 代码
    实现数据源方法
    • 先调多少组
    //调用数据源的下面方法得知一共有多少组数据
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    
    • 多少行
    //调用数据源的下面方法得知每一组有多少行数据
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    
    - 每行数据
    
    //调用数据源的下面方法得知每一行显示什么内容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    

    UITableView右边的索引条

    • 属性
    
        //设置tableView右边索引文字的颜色
        self.tableView.sectionIndexColor = [UIColor redColor];
        //设置右边索引文字背景的颜色
        self.tableView.sectionIndexBackgroundColor = [UIColor grayColor];
    
        //数据源方法索引信息
        - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
        //返回的是一个数组,数组中的元素是显示信息,只是提示,结果还是按索引位置分组
        return [NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil];
    }
    

    tableView常用方法

    //设置分组的头部数据
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        return @"头部";
    }
    //设置分组的尾部数据
    - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
    {
        return @"头部";
    }
    **
     *  当选中一行的时候调用(点击)
     */
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    //    XMGWine *wine = self.wineArray[indexPath.row];
    //    NSLog(@"点击了:%@", wine.name);
        NSLog(@"选中了:%zd", indexPath.row);
    }
    
    /**
     *  当取消选中一行的时候调用
     */
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"取消选中了:%zd", indexPath.row);
    }
    /**
     *  返回每个cell的高度
     */
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row % 2 == 0) {
            return 50;
        } else {
            return 100;
        }
    }
    

    UITableViewCell

    • cell 的样式属性
      • UITableViewCellStyleDefault
      • UITableViewCellStyleValue1
      • UITableViewCellStyleValue2
      • UITableViewCellStyleSubtitle
    • cell 右边指示样式的属性accessoryView

      • 优先级高于accessoryType
    • cell 右边指示样式的属性 accessoryType

      • UITableViewCellAccessoryNone
      • UITableViewCellAccessoryDisclosureIndicator
      • UITableViewCellAccessoryDetailDisclosureButton
      • UITableViewCellAccessoryCheckmark
      • UITableViewCellAccessoryDetailButton
    • cell 被点击的颜色变化iOS 7 之前的

      • UITableViewCellSelectionStyleNone
      • UITableViewCellSelectionStyleBlue
      • UITableViewCellSelectionStyleGray
      • UITableViewCellSelectionStyleDefault

    创建 Cell 的性能分析及优化

    cell的重用原理

    • iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象

      • 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
    • 还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell

      • 解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象

    不优化时内存分析

    不优化的时候

    • 离开可视范围就销毁
      • 频繁的开辟内存,销毁内存
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [[UITableViewCell alloc] init];
    
        cell.textLabel.text = [NSString stringWithFormat:@"%zd行",indexPath.row];
        NSLog(@"cellForRowIndexPath --%zd",indexPath.row);
        return cell;
    }
    

    优化后内存地址分析

    Cell的重用代码

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 1.定义一个cell的标识
        //static 定义变量----只初始换一次
          static NSString *ID = @"jrcell";
    
        // 2.从缓存池中取出cell
          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
        // 3.如果缓存池中没有cell
          if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        //尽量将cell的初始化设置,放在这个代码块中
        //如果这个设置是所有cell都要保持一致的,就可以放在这个代码块中
        cell.textLabel.font = [UIFont systemFontOfSize:30];
        }
    
        // 4.设置cell的属性...
    
          return cell;
    }
    

    cell的重用代码新写法

  • 相关阅读:
    Tomcat建立多个应用(Web Server),多个主机,多个站点的方法
    Spring 注解bean默认名称规则
    spring+springMVC,声明式事务失效,原因以及解决办法
    Spring事务失效的原因
    MySQL 对于千万级的大表要怎么优化?
    前端开发利器: Bootstrap + AngularJS
    scrapy爬取段子
    scrapy安装
    xpath和CSS选择器
    pycharm远程登录mysql
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/4606315.html
Copyright © 2011-2022 走看看