ViewWillAppear期间静态UITableViewCell更改未反映在显示中

时间:2013-01-24 10:10:23

标签: ios objective-c uitableview

我在故事板中使用了一些静态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设置除外,它会以某种方式被覆盖。

2 个答案:

答案 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.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;
        }
}

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

我不确定为什么cell.alpha被区别对待。也许是关于静态单元的实现方式。

答案 1 :(得分:0)

您可以尝试使用if { .. } else { .. }setNeedsDisplay之后提示应重新绘制单元格:

[self otherCell setNeedsDisplay]

根据您的评论,您如何到达otherCellIs this a post that might help