静态UITableViewCell在viewWillAppear中更改不会反映在显示中

我正在使用故事板中configuration的一些静态UITableViewCell来显示一些设置信息。

如果其他设置之一被closures,其他一些单元格应该被禁用。

为了使单元格进入适当的状态,在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; } 

问题是,当我真的运行该程序,即使它在日志中说,阿尔法改变,阿尔法实际上并没有改变。 userInteractionEnabled似乎坚持,但alpha保持在1.0。

这不是一个单元重用的问题,或者单元没有及时实例化,因为其他设置可以很好地改变。

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

似乎所有的设置“坚持”,除了alpha设置,这在某种程度上被覆盖。

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

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

我发现了两个修复:

首先 ,不要在cellForRowAtIndexPath中进行更改,而是在UITableViewDelegate方法willDisplayCell执行此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:] for?

UITableView背景与UITableViewCell导致问题的alpha颜色

另一个解决scheme是,而不是使用有问题的阿尔法,使用另一个设置,将达到相同的效果。 在我的情况下,这是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的单元格颜色设置,但如果您关心该问题,则可以通过向故事板询问颜色来解决该问题。

我不知道为什么cell.alpha被区别对待。 也许有关静态单元格的实现方式。

你可以尝试通过使用setNeedsDisplay提示单元格在你的if { .. } else { .. }之后重画if { .. } else { .. }

 [self otherCell setNeedsDisplay] 

根据你的评论,你如何获得其他otherCell ? 这是一个可能有帮助的职位 ?