静态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.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; } }
第二种方法的缺点是,现在您正在覆盖Storyboard的单元格颜色设置,但如果您关心该问题,则可以通过向故事板询问颜色来解决该问题。
我不知道为什么cell.alpha
被区别对待。 也许有关静态单元格的实现方式。
你可以尝试通过使用setNeedsDisplay
提示单元格在你的if { .. } else { .. }
之后重画if { .. } else { .. }
[self otherCell setNeedsDisplay]
根据你的评论,你如何获得其他otherCell
? 这是一个可能有帮助的职位 ?
- 缺省实现中缺lessUITableViewCell detailTextLabel
- 当tableview滚动时计数值被改变
- 当用户使用滑动手势对其进行编辑时,如何离开UITableViewCellEditingStyleDelete模式
- uitableview重新sorting不起作用,源始终等于目的地
- 如何实现在UITableView Cell中左右滑动,与iOS Mail类似
- iOS – 添加徽章到UITableViewCell
- 在UITableView-XMLparsing中混合了图像
- 如何重新创build静态单元格支持UITableViewController?
- 为UITableView调用beginUpdates / endUpdates有什么好处,而不是这样做?