微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用故事板中配置的一些静态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设置,它以某种方式被覆盖.

解决方法

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

首先,我尝试将alpha更改放在cellForRowAtIndexPath中,但这也无效.经过大量的修补,我得出结论,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;
        }
}

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐