zoukankan      html  css  js  c++  java
  • iOS中UItableView 的重用机制原理

    dequeueResableCellWithIdentifier方法

    //对table view的数据进行绑定,即填充cell,自动调用n次

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

     
         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];  
      if (cell== nil) {

           cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero

           reuseIdentifier:@"reuseIdentifier"] autorelease];

       }

        cell.text= [soundSignatures objectAtIndex:indexPath.row];

        return cell;

    }
     
    理解:
    UITabelview的Cell重用机制,总结重用机制如下:
    1. 维护一个重用队列
    2. 当元素离开可见范围时,removefromsuperView 并加入重用队列 (enqueue)
    3. 当需要加入新的元素是,先尝试从重用队列获取可重用元素(dequeue)并且从重用队列移除
    4. 如果队列为空,新建元素
    5. 这些一般都在scrollViewDidScroll:方法中完成

    每一个UITableView里都维护着一个cell队列,当UITableView刚加载的时候,cell队列里是没有任何数据的。

     
    dequeueResableCellWithIdentifier从字面上理解就是"出列可重用的cell标识符",
    也就是根据一个标识identifier从cell队列里取出一个UITableViewCell,
    当然了,如果cell队列里没有此标识的cell,调用此方法的结果就是返回nil。

    因此,在UITableView刚加载的时候,cell队列里没有可用的cell,所以必须通过语句

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    来创建对应CellIdentifier标识的UITableViewCell实例。

    [ tableView:cellForRowAtIndexPath:方法主要是根据NSIndex取得一个cell ]

    而当UITableView在滚动的时候导致UITableViewCell滚出手机屏幕视图的时候,
    程序会将这一个UITalbeViewCell实例放入此UITableView所维护的cell队列中。
    当UITableview中有新的UITableViewCell需要展现在手机屏幕视图上时,
    就会调用tableView:cellForRowAtIndexPath:方法了。

    因此我们可以知道以下几点:
    1-重取出来的cell是有可能已经捆绑过数据或者加过子视图的,所以,
    如果有必要,要清除数据(比如textlabel的text)和remove掉add过的子视图(使用tag)。
    2-这样设计的目的是为了避免频繁的 alloc和delloc cell对象而已,没有多复杂。
    3-设计的关键是实现cell和数据的完全分离

    如果不想重用UITableViewCell实例,如在一个每一行都显示不同内容的UITableView实例时,我们可以用如下的方法:
    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d",[indexPath section], [indexPath row]];
    来重新定义标识。
    这样每一行都有其对应的identifier,从cell队列里取出来只有两个结果:
    1-cell队列里没有此identifier对应的UITableViewCell实例,返回nil
    2-cell队列里有此identifier对应的UITableViewCell实例,而且不会有重用到其他不同行的cell的情况
  • 相关阅读:
    MT4系统自带指标代码
    [转载]一个鼠标键盘控制两台甚至多台主机的方法
    国内外证券交易系统开发平台比较
    Win8系统下MT4不能添加指标无法找到技术指标
    Unable to locate package错误解决办法
    ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock
    ubuntu永久修改主机名
    Ant之build.xml详解
    Memory和Storage有什么区别?
    ubuntu下创建eclipse桌面快捷方式
  • 原文地址:https://www.cnblogs.com/guiyangxueyuan/p/5308922.html
Copyright © 2011-2022 走看看