cell重用

原创
2017/04/11 11:05
阅读数 8

我们以前通常会这样做

- (UITableViewCell  *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     static  NSString  *CellIdentiferId = @"MomentsViewControllerCellID";
     MomentsCell  *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentiferId];
     if (cell == nil) {
        
NSArray *nibs = [[NSBundle mainBundle]loadNibNamed:@"MomentsCell" owner:nil options:nil];
        cell = [nibs 
lastObject];
        cell.
backgroundColor = [UIColor clearColor];
        

      };
        
     }

     return cell;

}

严重注意:我们之前这么用都没注意过重用的问题,这样写,如果在xib页面没有设置 重用字符串的话,是不能够被重用的,也就是每次都会重新创建,这是严重浪费内存的,所以,需要修改啊,一种修改方式是使用如下ios5提供的新方式:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

还有就是在xib页面设置好(ios5之前也可以用的)



如果忘了在xib中设置,还有一种方式  http://stackoverflow.com/questions/413993/loading-a-reusable-uitableviewcell-from-a-nib

NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];for (id obj in nibObjects){
    if ([obj isKindOfClass:[CustomTableCell class]])
    {        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }

}

还有更常用的

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return[self.items count];} -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell * cell =[tableView dequeueReusableCellWithIdentifier:@"myCell"];if(!cell){cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];}cell.textLabel.text =[self.items objectAtIndex:indexPath.row];return cell;

}


但是现在有一种新的方式了,可以采用如下的方式

采用registerNib的方式,并且把设置都放在了willDisplayCell方法中了,而不是以前我们经常用的cellForRowAtIndexPath

这个方法我试了下,如果我们在xib中设置了 Identifier,那么此处的必须一致,否则会crash的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
    MyCustomCell * cell = [tableView dequeueReusableCellWithIdentifier:
@"myCell"];
    
if (!cell)
    {
        [tableView registerNib:[UINib nibWithNibName:
@"MyCustomCell" bundle:nil] forCellReuseIdentifier:@"myCell"];
        cell = [tableView dequeueReusableCellWithIdentifier:
@"myCell"];
    }
    
    
return cell;
}

- (
void)tableView:(UITableView *)tableView willDisplayCell:(MyCustomCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.leftLabel.text = [
self.items objectAtIndex:indexPath.row];
    cell.rightLabel.text = [
self.items objectAtIndex:indexPath.row];
    cell.middleLabel.text = [
self.items objectAtIndex:indexPath.row];
}


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部