1

我有一个子类UITableViewCell它为我提供了自定义样式和额外数据。

当用户交互时一切正常,但是当我通过调用selectRowAtIndexPath它以编程方式选择它时,它会恢复为UITableViewCell使用蓝色背景选择的标准。

这是我的代码

[myTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
4

5 回答 5

1

看到这个问题:UITableView Cell selected Color

作为一种解决方法,您可以didSelectRowAtIndexPath在那里覆盖并设置背景颜色:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

设置backgroungColor为正常颜色覆盖didDeselectRowAtIndexPath

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath  
于 2013-09-09T05:17:11.487 回答
0

从@Andrey Gordeev 建议的解决方法开始,我将其扩展为包括在取消选择单元格后删除样式层。

由于其他原因,我仍然需要使用我的自定义单元格,但我已将其显示为下面的标准单元格,因此任何人都可以使用它

如果你必须打电话应用你自己的风格

[myTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];

选择单元格时添加渐变层

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];

    CAGradientLayer *gradient = [CAGradientLayer layer];
    [gradient setFrame:[cell.contentView bounds]];
    [gradient setColors:[NSArray arrayWithObjects:(id)[[UIColor colorWithWhite:0.70 alpha:1.0] CGColor], (id)[[UIColor colorWithWhite:0.50 alpha:1.0] CGColor], nil]];
    [[cell.contentView layer] insertSublayer:gradient atIndex:0];
    // The next line makes a reference to the gradient layer for selection and removal later on
    [[cell.contentView layer] setValue:gradient forKey:@"GradientLayer"];

    ...

}

取消选择单元格时删除渐变层

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];

    // Get the layer using the reference to it
    CALayer *gradientLayer = [[cell.contentView layer] valueForKey:@"GradientLayer"];
    [gradientLayer removeFromSuperlayer];
    [[cell.contentView layer] setValue:nil forKey:@"GradientLayer"];

    ...

}
于 2013-09-09T07:07:44.960 回答
0

cellForRowAtIndexPath方法中,在返回您的单元格实例之前添加此行:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
于 2013-09-09T06:00:35.063 回答
0

我有一个类似的问题,这是我解决它的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_NAME];...

      // Cell custom style
UIImage *background             = [self cellBackgroundForRowAtIndexPath:indexPath];
UIImageView *cellBackgroundView = [[UIImageView alloc] initWithImage:background];
cellBackgroundView.image        = background;
cell.backgroundView             = cellBackgroundView;

UIImage *selectedBackground             = [self cellBackgroundForRowAtIndexPath:indexPath];
UIImageView *cellselectedBackgroundView = [[UIImageView alloc] initWithImage:background];
cellBackgroundView.image                = selectedBackground;
cell.selectedBackgroundView             = cellselectedBackgroundView;
于 2013-09-09T07:33:12.373 回答
0

如果您已经实施didSelectRowAtIndexPath,那么在调用之后:

[myTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];

添加这一行:

[[myTable delegate]tableView:myTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

写:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
于 2013-09-09T05:19:42.377 回答