• 浅析UITableViewCell的工作机制


      UITableView的功能远比我们看到的要强大,可以任意的自定义UITableViewCell来满足我们的多种需求,比如缩略图。一下是我在使用UITableView的时候的一些心得,写在这里希望能帮到有需要的朋友,水平有限,经供参考。

      UITableView中的cell是动态的,在使用过程中,会创建一个cell的池,根据每个cell的高度,以及屏幕高度(480)计算屏幕中需要显示几个cell,例如cell高度75.f,

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        return 75.f;

    }

    那么就有ceil(480/75.f) = 6个cell,这样,无论这个UITableView有多少行,只需要alloc 6个cell在池中,这6个cell将在第一次显示时被生成,需要制定一个cellIdentifier来区分你所需要的不同种类的cell,但是对于同一类型(比如MyCell)的只需要制定一个identifier。这样,当某行(indexpath.row)需要显示在屏幕中时,从池中取出一个cell(cell池应该是一个队列,也就是永远取池中的第一个cell),你可以对它进行操作,改变它的属性,但是不要改变它本身,放在对应的row上。当某行移出屏幕时,这个cell就重新放回池中,等待下一次的显示,或者把它显示在了即将出现的那个新的row上。

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

    {

        static NSString * aCellIdentifier = @"my_cell";

        

        if (indexPath.row < [something count]) {

            MyCell * cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:aCellIdentifier];

            if (cell == nil) {

                cell = [[[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier: aCellIdentifier] autorelease];

                cell.delegate = self;

            }

            cell.tag = indexPath.row;

            //在这里改变cell的属性,但是不要改变它的子view和它本身

            return  cell;

        }

        

        return nil;

    }

    我在使用的过程中遇到的问题是:在定义MyCell的时候没有制定出里面需要显示的全部view,而是在改变cell属性的地方给它动态的添加对了view,导致在显示的时候出现问题。 这个问题目前我还说不太清原因,但是解决的办法就是正确的使用UITableViewCell,在cell初始化的时候生成它的全部子view。

  • 相关阅读:
    [面试题]什么是面向对象编程
    面向对象编程的新手理解
    Object of type type is not JSON serializable
    STL---map
    STL---llist
    Div标签使用inline-block有间距
    STL---vector
    KMP算法
    算法06
    算法05
  • 原文地址:https://www.cnblogs.com/kimimaro/p/2205319.html
Copyright © 2020-2023  润新知