iOS学习心得之:UITableView

01-预习复习

02-tableView简介

  • 概念

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

  • 支持垂直滚动

  • 以行为单位显示,每行显示一个 cell (单元格) <font color=red>(有且仅有一个,是一个多行单列的视图)</font>

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

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

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

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

  • 有两种样式(留个印象) <font color=red>(plain 和 grouped 样式)</font>

  • 小结

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

  • Cell 可以定制

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

  • 有一个 复用机制

  • 两种样式

03-tableView显示数据的模式

  • dataSource 提供数据的对象,显示的内容 <font color=red>(UITableViewDataSource)</font>

  • delegate 监听事件(选中,滚动到某一行) <font color=red>(UITableViewDelegate)</font>

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

    • tableView:
      • 总共有多少组 <font color=red>(- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView)</font>
      • 每一组有多少行 <font color=red>(- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section)</font>
      • 每个组/行显示的内容 <font color=red>(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)</font>
    • vc: <font color=red>vc一般作为数据源协议代理对象</font>
      • 告诉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的复用机制
  • <font color=red>不管你用不用复用机制,默认的cell在出屏幕时,会被UITableViewWrapper删除,并放到NSSet的cell缓存池里.这是UITableViewCell的默认行为.</font>
  • <font color=red>当使用复用机制时,会首先在cell缓存池里找复用的cell,找的到,拿出来重新赋值,找不到才alloc init. 这样可以节省alloc init的cpu开销.</font>

07-cell的复用机制图例

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

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

  • 默认default样式 <font color=red>左边一个UIImageView 右边一个 titleLabelText</font>

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

  • 先去缓存池找

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

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

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

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

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

09-iOS6以后的写法

  • 使用带indexPath参数的方法去缓存池找
  • 前提是先注册单元格 <font color=red>3中方式.看上面</font>
  • 如果注册单元格,当系统在缓存池没有找到的时候会自动创建一个注册的类型的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 <font color=red>修改背景色为灰色,组之间加间隔</font>

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容