我在故事板中使用了一些静态UITableViewCell
来显示一些设置信息。
如果切换其他设置之一,则应禁用其他一些单元格。
为了使单元格处于正确状态,在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
设置除外,它会以某种方式被覆盖。
答案 0 :(得分:5)
我正在回答我自己的问题,因为我能够解决它。
首先,我尝试在cellForRowAtIndexPath
中添加alpha更改,但这也无效。经过大量的修补,我得出的结论是UITableViewCell
的alpha设置在某种程度上是特殊的,因为它会被覆盖或设置为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
中无效。其他人似乎也不确定:
What is -[UITableViewDelegate willDisplayCell:forRowAtIndexPath:] for?
UITableView background with alpha color causing problem with UITableViewCell
另一个解决方案是,而不是使用有问题的alpha,使用另一个将实现相同效果的设置。就我而言,那是contentView.alpha
和backgroundColor
。无论出于何种原因,这些设置都会粘住,您甚至可以在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;
}
}
第二种方法的缺点是现在你正在覆盖故事板的单元格颜色设置,但如果你关心它,你可以通过向故事板询问颜色来解决这个问题。
我不确定为什么cell.alpha
被区别对待。也许是关于静态单元的实现方式。
答案 1 :(得分:0)
您可以尝试使用if { .. } else { .. }
在setNeedsDisplay
之后提示应重新绘制单元格:
[self otherCell setNeedsDisplay]
根据您的评论,您如何到达otherCell
?
Is this a post that might help?