设置UITableViewCell后台视图 - 哪种方式更好?

时间:2012-06-21 21:15:45

标签: uitableview uikit ios5

我一直在cellForRowAtIndexPath调用中设置我的UITableViewCell的背景,如下所示:

CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:simple];

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

    for (id findCell in nib )
    {
        if ( [findCell isKindOfClass: [CustomCell class]])
        {
            cell = findCell;
        }    
    }

    UIView *cellBackView = [[UIView alloc] initWithFrame:CGRectZero];
    UIView *cellSelectedBackView = [[UIView alloc] initWithFrame:CGRectZero];

    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) {

        cellBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"cell_shadows_ipad_light.png"]];
        cellSelectedBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"blue_cell.png"]];
    }else {
        cellBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"cell_shadows.png"]];
        cellSelectedBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"blue_cell.png"]];
    }

    cell.backgroundView = cellBackView;
    cell.selectedBackgroundView = cellSelectedBackView;

现在我发现还有另一种方法可以实现这一点,即在此委托中设置背景视图:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
   // load the background image and set it as the background color as above
}

从iOS5开始,您可以使用tableView注册nib,因此我也不需要循环查找类nib。所以,在viewDidLoad:

[self.tableView registerNib:[UINib nibWithNibName: @"CustomCellSplit" bundle:nil] forCellReuseIdentifier: @"CustomCellId"];

所以这个工作,它更简单,它是Apple推荐的加载单元格的笔尖和设置背景视图的方法。但是,我发现在滚动列表时,每个行都会调用此tableView:willDisplayCell:forRowAtIndexPath。通过我之前加载背景视图的方式,它只会在创建单元格时设置backgroundView(最多8或10次)。

因此,新方式听起来像是一种不太高效的加载单元格和设置backgroundViews的方式。这是正确的假设,还是我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:1)

原来这很简单。您只需在笔尖中添加子视图并将其连接到UITableViewCell中的selectedBackgroundView插座。

http://cl.ly/image/322L2k3j2U1A connecting selectedBackgroundView outlet from nib

瞧。

iOS5非常智能,可以在运行时从单元格的contentView中删除backgroundView。

无需使用tableView:willDisplayCell功能。