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

div*_*gio 4 objective-c uitableview ios

我使用UITableViewCell情节提要中配置的一些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;
        }
Run Code Online (Sandbox Code Playgroud)

问题是,当我实际运行该程序时,即使它在日志中说Alpha已更改,但Alpha实际上并没有更改。的userInteractionEnabled似乎确实棒,但是阿尔法在1.0离开。

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

将其从cell.alpha更改为cell.contentView.alpha是可行的,但这是不同的设置。

似乎所有设置都“粘住了”,但alpha设置已被覆盖。

div*_*gio 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;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,我不确定确切的原因,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;
        }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法的缺点在于,现在您将覆盖情节提要的单元格颜色设置,但是可以通过在情节提要中关心颜色来解决此问题。

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