关于UITableVIewCell在nib中复用的若干问题


http://www.tuicool.com/articles/67bYri

解释:
1.在上边这个贴子里一共放了三段代码,后两段是nib加载UITableViewCell的。
2.我平常使用的就是帖子中的第二种,今天发现,cell压根没定义id,复用不成(详情见帖子对第二段代码的分析)。当然,在nib文件里边直接给把id填上也是可以的,但是这种常常会忘记定义(毕竟不在nib中定义id也不会报错)。
3.所以准备用第三段代码,当然 BOOL nibsRegistered = NO 得改成 static BOOL nibsRegistered = NO,这问题我也知道,要不然也复用不成功;

问题:
1.第三种,如果我nib中有很多个cell怎么破?毕竟这种取法是不传索引的,但是我平常会在同一个类里定义多个样式的cell
2.他这种nibsRegistered的写法也不是很稳妥吧?我看了下UINib这对象,说是会预加载进内存,然后创建的时候,会获取此对象并初始化,在内存充足的时候这个是没有问题的,但是当内存不足的时候,会释放掉此UINib,导致nibsRegistered = Yes,但是tableview注册的UINib已经被释放了,就会创建cell失败。
ps: 第二个问题条件不允许,所以我没有去实践,只是我的猜想,如果我的猜想正确,烦请您告诉我解决办法,如果不正确,请告诉我我哪里想得不正确,谢谢。


 附上第三段代码


 static NSString *CellIdentifier = @"Cell";
    BOOL nibsRegistered = NO;
    if (!nibsRegistered) {
        UINib *nib = [UINib nibWithNibName:NSStringFromClass([Cell class]) bundle:nil];
        [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];
        nibsRegistered = YES;
    }
    Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.titleLabel.text = [self.dataList objectAtIndex:indexPath.row];
    return cell;

uitableviewcell ios objective-c swift

小强674 9 years, 11 months ago

One Nib One Cell

在 ViewDidLoad 里 [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];

然后就可以在 CellForRowAtIndexPath 里用 Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

全天都是满月 answered 9 years, 11 months ago

Your Answer