zoukankan      html  css  js  c++  java
  • 自定义 cell

    自定义 cell

    1 什么是自定义 cell

    自定义 cell 即 tableView,collectionView,scrollView中的 cell 使用的时候不能满足我们使用 cell 的需求,需要自己定义一个 cell.

    2 cell 的重用

         原因:cell 的显示原理的,一个 cell 显示一条数据,但是如果有大量的数据需要显示的时候理论上就需要大量的 cell, 这显然是不能满足我们的需求的,因此需要重复应用 cell.cell 的重用就是将显示过的 cell 放在重用池中(而不是销毁或者一直保存),等待着再次被调用.

        重用 cell 的机制:我们创建 cell 的时候只创建比屏幕显示的最大 cell 数量多一个的 cell,并且创建的时候创建一个重用标示符.将用过的 cell 放在重用池中,当数据再次加载的时候,数据源根据重用标示符先去重用池中找 cell, 如果有的话,则不创建 cell 直接使用,如果没有的 cell 的话,在创建带有重用标示符的cell.

         重用的实现分析: 查看UITableView头文件. 系统默认有一个可变数组NSMutableArray*  visiableCells,用来保存当前显示的cell.一个可变字典NSMutableDictnery* reusableTableCells,用来保存可重复利用的cell.(之所以用字典是因为可重用的cell有不止一种样式,我们需要根据它的reuseIdentifier,也就是所谓的重用标示符来查找是否有可重用的该样式的cell).

       TableView显示之初,reusableTableCells为空,那么当系统在调用[tableView dequeueReusableCellWithIdentifier:重用标示符]的时候,返回的值就为nil。开始时的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]的方法来创建,而且当系统调用cellForRowAtIndexPath只是调用最大显示cell数的次数。

    3 cell 的重用步骤:

         实现以下三个方法

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

       //返回的组数(即该 tableView有多少组组成)

    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

       //每组有多少行(行数可以的固定值也可以的根据需求自己设置)

    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //每一行中的内容

    //1 定义一个重用标示符(注意一般要加上 static 修饰)

    //2 用重用标示符通过[tableView deq…]的方法去重用池中寻找cell

    //3 判断2中是否找到 cell,如果没有找到可用的 cell,则创建cell(注:创建 cell 的时候一定要带重用标示符)

    }

    4 方法使用分析

    系统第一次执行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这个方法的时候, reusableTableCells为空,[tableView dequeueReusableCellWithIdentifier:identifier]的返回值为nil,我们需要通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: identifier]方式来创建.

    当我们的数据过多,整个屏幕的cell显示不完全时,这个方法的执行情况是 :

    (1) 先执行[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: identifier]创建整个屏幕能显示的cell数+1的cell(当我们拖动UITableView的时候,第一个cell没有移出屏幕,最下面的cell就已经存在),并指定相同或者不同的标示符identifier.把创建出的屏幕能显示的cell全部都加入到visiableCells数组中(最后一个创建的先不加入数组),reusableTableCells为空.

    (2)当我们拖动屏幕时,顶端的cell移出屏幕并加入到reusableTableCells字典中,键为identifier ,并把之前已经创建的但是没有加入到visiableCells的cell加入到visiableCells数组中.

    (3)当我们接着拖动的时候,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用,执行[tableView dequeueReusableCellWithIdentifier: identifier],返回一个标示符为identifier的cell。该cell移出reusableTableCells之后加入到visiableCells;顶端的cell移出visiableCells并加入到reusableTableCells.如果visiableCells数组中没有找到identifier类型的cell,则再次重新alloc一个.

    (4)注1: reusableTableCells在使用的时候并不是只在拖动屏幕的时候才刷新列表,在以下情况也会更新

    > reloadData,这种情况比较特殊。一般是部分数据发生变化,需要重新刷新cell显示的内容时调用。在cellForRowAtIndexPath调用中,所有cell都是重用的。reloadData调用后,把visiableCells中所有cell移入reusableTableCells,visiableCells清空。cellForRowAtIndexPath调用后,再把reuse的cell从reusableTableCells取出来,放入到visiableCells.

    > reloadRowsAtIndex,刷新指定的IndexPath。如果调用时reusableTableCells为空,那么cellForRowAtIndexPath调用后,是新创建cell,新的cell加入到visiableCells。老的cell移出visiableCells,加入到reusableTableCells。于是,之后的刷新就有cell做reuse了.

    (5)注2: 在iOS6之后系统加入了一种单元格注册的方法.

         [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: identifier];

       这个方法的作用是,当我们从重用队列中取cell的时候,如果没有,系统会帮我们创建我们给定类型的cell,如果有,则直接重用. 这种方式cell的样式为系统默认样式.

    5 重用 cell 的优点:

    • 自定义 cell 是继承自系统的 cell, 因此它具有系统 cell 的所有的属性和方法
    • 自定义 cell 可以在自定义的类中扩展属性和方法,供外界使用.

    使用方法

    6 注意事项

         cell 的重用的时候,由于 cell 中原来的数据还有可能存在,因此重用 cell 的时候一定要先对 cell进行复制,然后在使用.

    7 自定义 cell 的方法有三种

    • 纯代码

    1 在自定义 cell 类的.h 文件中声明要增加的属性和方法

    2 在自定义cell 类的.m 文件中实现增加的方法.

    该类的构造方法 initWithStyle:--- reuseIdentify  方法

    调用父类的构造方法

    判断 self是否存在

    返回 self

    3 在 VC 中的数据源方法中的第三个方法中将系统的 cell 换成自定义的 cell 的类即可拥有自定义 cell 扩展的属性和方法.

    先创建一个 static 的重用标示符,然后通过重用标示符去重用池中寻找,假如通过重用标示符找不到 cell 则通过自定义的 cell 创建 cell, 最后返回 cell.

    4 应用举例:

         4.1.新建一个类MyCell继承自UITableViewCell

     4.2.初始化方法中添加自己的控件

    -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    {

    self =[super initWithStyle:style reuseIdentifier:reuseIdentifier];

        if (self) {//添加子控件}

        return self;

    }

    4.3.使用

    //定义重用标示

    static NSString *cellIdenifer = @“MyTableViewCell";

    MyCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdenifer];

        if (!cell)  {

             cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdenifer

        }

     

    • Xib

    实现步骤:

    1 创建一个类 继承自 UITableViewCell/

    UICollectionViewCell/UIScrollViewCell

    2 创建一个和步骤一同名的 xib

    3 将一个 cell拖到xib窗口中,并在属性检查器上

        (1)修改Custom Class为 创建从类名

        (2)设定其重用标识符(Identifier),该重用标示符要和 VC 中定义的重用标示符一样.

              4 在 xib 中根据需求进行布局

         5 将 xib 中的控件拖线到cell上

    6 使用的时候,调用方为:[[[NSBundle mainBundle] loadNibNamed:@“xib文件名"owner:nil options:nil] lastObject];

    7 应用举例:

                            static NSString *cellIdenifer = @"重用标示符";(应该跟xib中cell设置的idenifier吻合)

       自定义的cell类 *cell = [tableView dequeueReusableCellWithIdentifier:重用标示符];

        if (!cell)  {

            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"重用标示符" owner:nil options:nil];(此为刚才新建的xib的名字)

            for (id oneObject in nib) {

                if ([oneObject isKindOfClass:[自定义 cell 的类 class]]) {

                cell = (LPDishTableViewCell *)oneObject;

                }

            }

        }

    • tableView的代理方法中自定义 cell

    //定义重用标示

    static NSString *cellIdenifer = @“MyTableViewCell";

    MyTableViewCell *cell = [tableView cellIdenifer ];

     if (!cell) {

     cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellIdenifer];

    UILabel *aaa = [[UILabel alloc] init]

    [cell addsubview:aaa];

    aaa.tag = 111;

                }

  • 相关阅读:
    <<网络是怎样连接的>>笔记第一章browser生成message
    豆知识( DNS; HTTP入门;网络协议)
    日期和时间的操作
    类型转换
    分组查询
    存储过程
    触发器
    表连接
    变量
    union以及一些扩展
  • 原文地址:https://www.cnblogs.com/xuan-yuan/p/5429798.html
Copyright © 2011-2022 走看看