【原】 从cellForRowAtIndexPath 看cell的重用机制

今天突然发现一个问题,由于对UITableViewCell 的重用机制不是很了解,让我纠结很久;

用过reloadData时候,会调用cellForRowAtIndexPath方法,但是请看以下2种cellForRowAtIndexPath 的写法:

写法A:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *brand_region_Cell = @"MyCell";
    
    UITableViewCell *celll = [region_table dequeueReusableCellWithIdentifier:MyCell];
    
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:
                      UITableViewCellStyleDefault reuseIdentifier:@"MyCell" ];
        
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
    }
    
    Obj *obj = [objs objectAtIndex:indexPath.row];
    cell.textLabel.text = obj.obj_name;
    
    return celll;
    
}

写法B:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *brand_region_Cell = @"brand_region_Cell";
    
    UITableViewCell *cell = [region_table dequeueReusableCellWithIdentifier:MyCell];
    
    if (cell == nil)
    {
    cell = [[UITableViewCell alloc] initWithStyle:
                      UITableViewCellStyleDefault reuseIdentifier:@"MyCell" ];
        
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
    }
    
    Obj *obj = [objs objectAtIndex:indexPath.row];
    cell.textLabel.text = obj.obj_name;
    
    return cell;
    
}

原文网址:http://www.cnblogs.com/A--G/p/4540919.html

大家觉得这两种写法有什么不同吗?

额,在创建tableView时候,cellForRowAtIndexPath根据section的数量被调用, 在执行reloadData也会调用cellForRowAtIndexPath但是,cell已经存在了,故if (cell == nil){}里面的代码不会执行,reloadData方法,顾名思义,就是刷新cell的data的,所以cell的data写在cell判空外面,这是俺犯的一个错误,不知道理解的对不对,欢迎指点~

  转载请注明原文网址,谢谢~

时间: 2024-10-16 00:06:05

【原】 从cellForRowAtIndexPath 看cell的重用机制的相关文章

iOS-cell的重用机制

对于像我们这样的初学者来说,cell重用机制是很难理解的内容,所以我们不一定非得理解,会用就行. cell的重用机制:当我们使用tableView时,系统只会创建屏幕中显示的cell的个数+1,当cell滑出可视范围时,会将此cell放出重用池,当有新的cell滑进可视范围时,先到重用池里去找,找不到就创建,找得到就直接用,所以会用串(有时候不会串<cell的个数小于3>) 防止用串的方法:1.设置标签2.不用重用池,直接创建3.拿出来用之前,清空原内容 一.设置标签(这是最常用的) cell

Android从源代码看ListView的重用机制

无论是android还是iOS,列表视图应该是最复杂的控件了,android中的listview从命名可以看出是个一维数组,而iOS中的tableview则是二维数组,但其实需要注意的地方是差不多的,都是重用机制,这是考量你对listview能否掌握的最好的方法. 常见的listview的初始化以及设置适配器的代码如下: ListView listView; MyAdapter listAdapter; ArrayList<String> listString; listView = (Lis

cell的重用机制

重用机制 简单的说 意思 一行一行 的cell 都是在复用的, 滑动 tableview 的时候,刚离开视图的 cell 会被放到复用池 中,等下一个 cell需要 显示时,会先看复用池中有没有 cell 如果有的时候 ,就从复用池中拿出来cell ,没有的话就重新创建cell. 废话不多说直接上代码: // //  ViewController.m //  tableView // //  Created by WBapple on 15/12/1. //  Copyright © 2015年

tableView中cell的重用机制

这里就涉及了TableView的重用机制,为了做到显示和数据分离,iOS tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的.下面简要分析一下它的实现原理. 重用实现分析 查看UITableView头文件,会找到visibleCells,和自己设想的一个reusableCells两个结构.visiableCells内保存当前显示的cel

Android从源码看ListView的重用机制

不管是android还是iOS,列表视图应该是最复杂的控件了.android中的listview从命名能够看出是个一维数组,而iOS中的tableview则是二维数组.但事实上须要注意的地方是差点儿相同的.都是重用机制.这是考量你对listview是否能掌握的最好的方法. 常见的listview的初始化以及设置适配器的代码例如以下: ListView listView; MyAdapter listAdapter; ArrayList<String> listString; listView

ios之TableViewCell重用机制避免重复显示问题

常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复 // 这样配置的话超过页面显示的内容会重复出现 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 定义唯一标识 static NSString *CellIdentifier = @"Cell"; // 通过唯一标识创建cell实例 UI

ios之清除cell缓存,解决cell的重用问题。

原文:http://blog.csdn.net/chaoyuan899/article/details/13291637 tableView表格中的cell有重用机制,这是一个很好的东西,可以避免开辟很多的空间内存.但是有时候我们不想让它重用cell,,可以用以下的代码解决. 将这个代码放在: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

ios UItableView,UITableViewHeaderFooterView分组头部的重用机制,简单地仿射变换CGAffineTransform

怎样设置包括第一栏在内相同高度的section(小技巧,虽然容易但容易忽略) *第一步,在viewdidload里将尾部设为0,table.sectionFooterHeight = 0;(代理方法)- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ return 0; }虽然也可以设置尾部高度,但是设置后没有效果 第二步,调用tableView的代理方法- (CGF

IOS Table中Cell的重用reuse机制分析

原文:http://blog.csdn.net/omegayy/article/details/7356823 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = [NSString