重要控件-UITableView

1. 介绍

在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView。UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳。

2.UITableView展示数据

  • UITableView需要一个数据源(dataSource)来显示数据
  • UITableView会向数据源查询一共有多少行数据以及每一行显示什么数据等
  • 没有设置数据源的UITableView只是个空壳
  • 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源

UITableView和数据源关系如下图
UITableView和数据源

tableView展示数据的过程如下

// 1.调用数据源的下面方法得知一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

// 2.调用数据源的下面方法得知每一组有多少行数据
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// 3.调用数据源的下面方法得知每一行显示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

UITableView去除分割线方法

    // 去除分割线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

3. UITableViewCell

3.1 Cell简介

  • UITableView的每一行都是一个UITableViewCell,通过 -dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行

  • UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图

  • 辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的accessoryType来显示,默认是UITableViewCellAccessoryNone(不显示辅助指示视图),其他值如下:

*UITableViewCellAccessoryDisclosureIndicator这里写图片描述

*UITableViewCellAccessoryDetailDisclosureButton这里写图片描述

*UITableViewCellAccessoryCheckmark这里写图片描述

  • 还可以通过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关)

3.2 UITableViewCell的contentView

  • contentView下默认有3个子视图
    -其中2个是UILabel(通过UITableViewCell的textLabel和detailTextLabel属性访问)
    -第3个是UIImageView(通过UITableViewCell的imageView属性访问)
    UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置

    UITableViewCellStyleDefault这里写图片描述
    UITableViewCellStyleSubtitle这里写图片描述
    UITableViewCellStyleValue1这里写图片描述
    UITableViewCellStyleValue2这里写图片描述

    • 下图是UITableViewCell的结构
      UITableViewCell的结构

3.3 Cell的重用原理

还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell

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

  • Cell的重用代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.定义一个cell的标识
      static NSString *ID = @"mjcell";

    // 2.从缓存池中取出cell
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    // 3.如果缓存池中没有cell
      if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }

    // 4.设置cell的属性...

      return cell;
}

3.4 通过代码自定义cell(cell的高度不一致)

1.新建一个继承自UITableViewCell的类

2.重写initWithStyle:reuseIdentifier:方法
添加所有需要显示的子控件(不需要设置子控件的数据和frame, 子控件要添加到contentView中)
进行子控件一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片)

3.提供2个模型
数据模型: 存放文字数据\图片数据
frame模型: 存放数据模型\所有子控件的frame\cell的高度

4.cell拥有一个frame模型(不要直接拥有数据模型)

5.重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame

6.frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)

3.5 UITableViewController

在storyboard中有UITableViewController这个控制器。
这里写图片描述

UITableViewController可以管理UITableView,自动创建一个有正确维数和尺寸的示例,并且成为table view的代理和数据源。
所以使用UITableViewController就不用手动设置数据源和代理了。

UITableViewController的内容默认是动态模型。
当我们设计的页面的内容不需要动态改变,每次打开都一样的时候我们可以将其改为静态cell模型,可以直接在storyboard编辑每一组,每个cell的内容。
Static Cells

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值