4

我正在使用UITableViewCellStoryboard 中配置的一些 static 来显示一些设置信息。

如果关闭其他设置之一,则应禁用其他一些单元格。

为了使单元格处于正确状态,在viewWillAppear我从 NSUserDefaults 读取设置期间,然后相应地更改单元格。

- (void) viewWillAppear:(BOOL)animated
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
            [self otherCell].alpha = 1.0;
            [self otherCell].userInteractionEnabled = YES;
        }
        else {
            NSLog(@"Changing alpha to 0.3");
            [self otherCell].alpha = 0.3;
            [self otherCell].userInteractionEnabled = NO;
        }

问题是,当我实际运行程序时,即使它在日志中说 alpha 已更改,但 alpha 实际上并没有更改。userInteractionEnabled似乎确实存在,但 alpha 保持在 1.0 。

这不是单元重用的问题,也不是单元没有及时实例化的问题,因为其他设置可以更改。

将其从 cell.alpha 更改为 cell.contentView.alpha 有效,但这是一个不同的设置。

似乎所有设置都“坚持”,除了alpha设置,不知何故被覆盖。

4

2 回答 2

5

我正在回答我自己的问题,因为我能够解决它。

首先,我尝试将 alpha 更改放入cellForRowAtIndexPath,但这也不起作用。经过大量修改后,我得出的结论是UITableViewCellalpha 设置在某种程度上是特殊的,因为它不断被覆盖或设置为 1.0。

我找到了两个修复:

首先,不要在方法中做改变cellForRowAtIndexPath,而是在UITableViewDelegate方法中做willDisplayCell。无论出于何种原因,在这种方法中更改单元格的 alpha 值实际上都会坚持下去。当然,如果你这样做,你必须重新安排你的逻辑,以便逐个单元地完成更改,即:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  
                                         forRowAtIndexPath:(NSIndexPath *)indexPath {
if (cell == [self otherCell]) {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
        cell.alpha = 1.0;
        cell.userInteractionEnabled = YES;
    }
    else {
        NSLog(@"Changing alpha to 0.3");
        cell.alpha = 0.3;
        cell.userInteractionEnabled = NO;
    }
}
}

正如我所说,我不确定为什么这适用于willDisplayCell但不适用于cellForRowAtIndexPath. 其他人似乎也不确定:

-[UITableViewDelegate willDisplayCell:forRowAtIndexPath:] 是什么?

带有 alpha 颜色的 UITableView 背景导致 UITableViewCell 出现问题

另一种解决方案是使用另一个设置来实现相同效果,而不是使用有问题的 alpha。就我而言,那是contentView.alphabackgroundColor。无论出于何种原因,这些设置都会保留,您甚至可以设置它们viewWillAppear,它会按预期工作:

- (void) viewWillAppear:(BOOL)animated {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) {
            [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
            [self otherCell].contentView.alpha = 1.0;
            [self otherCell].userInteractionEnabled = YES;
        }
        else {
            NSLog(@"Changing alpha to 0.3");
            [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3];
            [self otherCell].contentView.alpha = 0.3;
            [self otherCell].userInteractionEnabled = NO;
        }
}

第二种方法的缺点是现在您正在覆盖 Storyboard 的单元格颜色设置,但是如果您关心的话,您可以通过询问 Storyboard 的颜色来解决这个问题。

我不确定为什么cell.alpha会受到不同的对待。也许与静态单元的实现方式有关。

于 2013-01-24T10:49:30.307 回答
0

您可以尝试使用以下方法提示应在您的if { .. } else { .. },之后重绘单元格setNeedsDisplay

[self otherCell setNeedsDisplay]

根据您的评论,您如何到达otherCell这是一个可能有帮助的帖子吗?

于 2013-01-24T10:29:32.583 回答