storyboard顶用xib文件创建定制的UITableViewCell对象

storyboard中用xib文件创建定制的UITableViewCell对象

      IOS5.0之后,在UITableView里可直接绘制自定义的UITableViewCell,还不会自定义UITableViewCell,直接传送门。要记得的是storyboard中的identifier(标识)一定要和代码中一致,用起来直观方便,似乎原来从xib(nib)文件中读取的时代,已经一去不复返了。但假设我们有UITableViewA和UITableViewB,我们在UITableViewA中自定义了好几个UITableViewCell,现在我们要在UITableViewB中重用这些现成的UITableViewCell,比较理想的方法就是在UITableViewB中使用identifier创建,但是不行,因为在UITableViewA中正常使用的dequeueReusableCellWithIdentifier:在UITableViewB返回的竟是nil。

       这里我们首先了解下identifier的作用,每一个UITableViewCell都会有一个reuseIdentifier(重用标识),当配置了reuseIdentifier,UITableView会将这个对象连同reuseIdentifier一起放到自己对象池里,当再次创建UITableViewCell对象时,UITableView会先在对象池中匹配是否已经创建过这个对象,若创建了,则不再重新创建(如果重复创建,当UITableView行数较多时,会耗光IOS的内存),直接返回之前已创建的对象。因此,我们通过UITableViewA创建的UITableViewCell,在UITableViewA对象池中,已经按我们定义的identifierA,完成重用,但其作用范围仅在UITableViewA的对象池内,当我们调用UITableViewB,其 list of UITableViewCell objects 还是空的,所以其返回值肯定为空。这里我也大胆的猜测一下storyboard在载入UITableViewA时,会自动将它的UITableViewCell(我们定制的)的界面资源载入一次,所以我们可以直接调用dequeueReusableCellWithIdentifier: .


       既然不能直接调用,我们只能走回通过xib文件的老路了,在xcode中继续创建xib文件,然后子类化UITableViewCell,并与xib文件相关联,在UITableView中载入时,我给一段我的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier ;
    UITableViewCell *cell;
    //自己子类化的UITableViewCell
    LableSwitchXibCell * lableSwitchCell;
    UINib *n;
    if ([indexPath section ] == 0 ) {
        CellIdentifier = @"LableSwitchXibCell";
        lableSwitchCell  = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (lableSwitchCell == nil) {
            NSArray *_nib=[[NSBundle mainBundle] loadNibNamed:@"LableSwitchCell" 
                                                        owner:self  options:nil];
            lableSwitchCell  = [_nib objectAtIndex:0];
            //通过这段代码,来完成LableSwitchXibCell的ReuseIdentifier的设置
            //这里是比较容易忽视的,若没有此段,再次载入LableSwitchXibCell时,dequeueReusableCellWithIdentifier:的值依然为nil
            n= [UINib nibWithNibName:@"LableSwitchCell" bundle:[NSBundle mainBundle]];
            [self.tableView registerNib:n forCellReuseIdentifier:@"LableSwitchXibCell"];
        }
    }

}


       需要注意的就是要调用IOS5.0加入的函数registerNib:forCellReuseIdentifier:,最后再总结一下,UITableViewCell的重用标识,并没有用一个全局的对象池,其是只对单个UITableView实例而言的重用标识,Demo有些大,我就不发了,有童鞋想要我再发。