在分组的UITableView中设置所选UITableViewCell的背景

时间:2013-07-13 21:01:27

标签: ios uitableview

这适用于我的普通样式表视图,但不适用于我的分组样式。我正在尝试自定义单元格在选中时的外观。

这是我的代码:

+ (void)customizeBackgroundForSelectedCell:(UITableViewCell *)cell {
    UIImage *image = [UIImage imageNamed:@"ipad-list-item-selected.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    cell.selectedBackgroundView = imageView;
}

我已经验证了正确的单元格确实被传递到此函数中。我需要做些什么才能使其发挥作用?

1 个答案:

答案 0 :(得分:1)

从您的问题中不清楚您是否知道tableViewCell会根据其选择状态自动管理显示/隐藏它的selectedBackgroundView。除viewWillAppear之外,还有更好的方法可以放置该方法。一个是你最初创建tableViewCells的时候,即:

- (UITableViewCell *)tableView:(UITV*)tv cellForRowAtIP:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    cell = [tv dequeueCellWithIdentifier:@"SomeIdentifier"];
    if (cell == nil) {
        cell = /* alloc init the cell with the right reuse identifier*/;
        [SomeClass customizeBackgroundForSelectedCell:cell];
    }
    return cell;
}

您只需要在该单元格的生命周期中将selectedBackgroundView属性设置为一次。单元格将在适当时管理显示/隐藏它。

另一种更清洁的技术是子类UITableViewCell,在子类的.m文件中,覆盖:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithBla....];
    if (self) {
        UIImageView *selectedBGImageView = /* create your selected image view */;
        self.selectedBackgroundView = selectedBGImageView;
    }
    return self;
}

从那时起,您的单元格应显示自定义选定的背景,无需进一步修改。它只是有效。

此外,对于使用以下UITableView方法在viewDidLoad:中使用表视图注册表视图单元类的当前建议做法,此方法更有效:

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier

您将在表视图控制器的viewDidLoad方法中使用此方法,以便您的表视图单元格出列实现更短且更易于阅读:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[SomeClass class]
           forCellReuseIdentifier:@"Blah"];
}

- (UITableViewCell *)tableView:(UITV*)tv cellForRowAtIP:(NSIndexPath *)indexPath {
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:@"Blah"
                                           forIndexPath:indexPath];
    /* set your cell properties */
    return cell;
 }

只要您注册了具有@"Blah"标识符的类,此方法就可以保证返回单元格。