iOS学习心得之:UITableView

01-预习复习

02-tableView简介

  • 概念

  • 非常非常常用,没有tableView基本就不能叫应用

  • 支持垂直滚动

  • 以行为单位显示,每行显示一个 cell (单元格) (有且仅有一个,是一个多行单列的视图)

  • 每一个 cell 都是一个 UITableViewCell 对象

  • 自定义 UITableViewCell 能够表现非常丰富的界面展现 (主要是可定制自定义的UITableViewCell 里面的 contentView 可以很自由的布局和添加任意子控件)

  • UITableView 的性能优化是目前面试中被问及频率颇高的问题 (cell复用,只重新赋值,不重新创建)

  • UITableView 内置了复用机制,实现性能优化

  • 有两种样式(留个印象) (plain 和 grouped 样式)

  • 小结

  • 一行(row) 一个 Cell,垂直滚动

  • Cell 可以定制

  • 要满足快速滚动,表格的性能很重要

  • 有一个 复用机制

  • 两种样式

03-tableView显示数据的模式

  • dataSource 提供数据的对象,显示的内容 (UITableViewDataSource)

  • delegate 监听事件(选中,滚动到某一行) (UITableViewDelegate)

  • 系统提供了tableView的垂直滚动,可以以行的形式显示,可以选中等等.但本身并不知道显示的内容,需要另外一个对象(vc)通过数据源提供

    • tableView:
      • 总共有多少组 (- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView)
      • 每一组有多少行 (- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section)
      • 每个组/行显示的内容 (- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)
    • vc: vc一般作为数据源协议代理对象
      • 告诉tableView有多少组
      • 告诉tableView每一组有多少行
      • 告诉tableView每个组/行现实的内容

04-数据源方法调用顺序

  • 1.首先要知道有几个组
  • 2.如果有组,判断每一组有多少行
  • 3.如果没有行数,不会调用内容
  • 4.如果有行数才会调用内容,并且不能返回为空,否则程序崩溃
  • indexPath有两个重要的属性,组和行

05-cell的四种样式/内置三个控件


typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    /// 默认样式,只提供文本和图像视图(可选),不显示明细标签
    UITableViewCellStyleDefault,    // Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x)
    /// 在左侧左对齐标签,在右侧右对齐明细标签(设置中使用)
    UITableViewCellStyleValue1,        // Left aligned label on left and right aligned label on right with blue text (Used in Settings)
    /// 在左侧右对齐标签,在右侧左对齐明细标签(通讯录中使用)
    UITableViewCellStyleValue2,        // Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)
    /// 在顶部左对齐标签,在底部右对齐明细标签
    UITableViewCellStyleSubtitle    // Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).
};


/// 图像视图,默认为 nil,在需要时创建
@property (nonatomic, readonly, strong, nullable) UIImageView *imageView NS_AVAILABLE_IOS(3_0);   // default is nil.  image view will be created if necessary.

/// 文本标签,默认为 nil,在需要时创建
@property (nonatomic, readonly, strong, nullable) UILabel *textLabel NS_AVAILABLE_IOS(3_0);   // default is nil.  label will be created if necessary.

/// 明细文本标签,默认为 nil,在需要时创建,同时 `style` 必须支持 `detail label`
@property (nonatomic, readonly, strong, nullable) UILabel *detailTextLabel NS_AVAILABLE_IOS(3_0); // default is nil.  label will be created if necessary (and the current style supports a detail label).

06-cell不重用出现的问题

  • 显示出来的时候才会被创建
  • 当一个cell消失再显示就会重新被创建,为了解决这个问题,苹果推出了cell的复用机制
  • 不管你用不用复用机制,默认的cell在出屏幕时,会被UITableViewWrapper删除,并放到NSSet的cell缓存池里.这是UITableViewCell的默认行为.
  • 当使用复用机制时,会首先在cell缓存池里找复用的cell,找的到,拿出来重新赋值,找不到才alloc init. 这样可以节省alloc init的cpu开销.

07-cell的复用机制图例

  • 不显示时从父控件中移除后暂时存到缓存池,需要显示新的cell时先从缓存池找

08-使用cell重用机制/static标识符

  • 默认default样式 左边一个UIImageView 右边一个 titleLabelText

  • 不要直接创建cell 注册UITableViewCell的类型有3中方式:1.registerClass 2.xib 3.sb 拖拽一个 UITableViewCell 并设置 identifier

  • 先去缓存池找

  • 去缓存池找有两个方法,先使用不带indexPath参数的方法

  • cell如果没有找到会返回为nil

  • 判断,如果为nil重新创建

  • 因为cellForRow会调用很多次,如果只是string类型相当于会被分配很多次空间,所有加上static

  • 加上static会在静态区,不加会在栈区.

09-iOS6以后的写法

  • 使用带indexPath参数的方法去缓存池找
  • 前提是先注册单元格 3中方式.看上面
  • 如果注册单元格,当系统在缓存池没有找到的时候会自动创建一个注册的类型的cell
  • 不带indexPath
 1.去缓存池找
 2.如果没有找到,返回nil
 3.判断是否找到(是否为nil)
 4.如果为空,那么应该重新创建cell
  • 带indexPath
 1.去缓存池找.
 2.如果没有找到,会自动创建一个,当初注册的类型的cell
// 注册单元格"下面这行代码一定要在数据源方法调用之前实现"
[self.tableView registerClass:[TestCell class] forCellReuseIdentifier:cellid];

// 去缓存池找cell"没有可重用的cell,根据注册类型的cell,自动创建"
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellid forIndexPath:indexPath];
      

10-注册单元格调整样式

  • 重写cell的initWithStyle:方法
  • NS_DESIGNATED_INITIALIZER 默认棕色 宏定义 含义?
    • 如果你要继承这个控件自定义某个类,重写这个方法

11-cell内部控件懒加载概念

  • 需要用的时候再加载再创建就叫做懒加载,不要想复杂,只是起这么个名字

12-tableView的样式

  • 系统默认而言,拖拽tableView如果是白色就是plain,灰色就是grouped 修改背景色为灰色,组之间加间隔

13-展示汽车品牌-分析需求

  • 需要一个tableView
  • 组的样式
  • plist根节点是'数组'
  • 字典表示表示每一组的内容
  • 字典下面三个key: title : desc : cars
    • title: 组上面的内容
    • desc: 组下面的内容
    • cars: 当前组中所有的cell的内容 (cell.textLabel)

14-展示汽车品牌-组的头尾标题

- (NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section // 组下面的title
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section // 组上面的title

你可能感兴趣的:(iOS学习心得之:UITableView)