这是有问题的应用程序部分的设置。
MyTableViewController 是我的自定义 UITableViewController 类。
TableViewController1、2 和 3 都是 MyTableViewController 类型。1和2是由一个tabbarcontroller控制的viewcontrollers,3是在从1中选择一个单元格后压入栈中的。
BaseCell 是我的 UITableViewCell 子类。
MyCell1、2 和 3 都是 BaseCell 类型。
细胞是这样设置的
基本单元
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
UIView *myContentView = self.contentView;
self.gradientView = [[UIView alloc] initWithFrame:myContentView.frame];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.colors = [UIColor grayGradient];
[self.gradientView.layer insertSublayer:gradient atIndex:0];
self.gradientView.backgroundColor = [UIColor blueColor];
[myContentView addSubview:self.gradientView];
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if (selected) {
self.gradientView.layer.hidden = TRUE;
} else {
self.gradientView.layer.hidden = FALSE;
}
}
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
[super setHighlighted:highlighted animated:animated];
// Configure the view for the highlighted state
if (highlighted) {
self.gradientView.layer.hidden = TRUE;
} else {
self.gradientView.layer.hidden = FALSE;
}
}
-(UILabel *)newLabelWithColor:(UIColor *)incomingColor font:(UIFont *)incomingFont
{
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectZero];
newLabel.backgroundColor = [UIColor clearColor];
newLabel.opaque = YES;
newLabel.textColor = incomingColor;
newLabel.highlightedTextColor = [UIColor whiteColor];
newLabel.font = incomingFont;
return newLabel;
}
因此,扩展 BaseCell 的每个单元格都有渐变背景。Cell1、2 和 3 继续以类似的方式向 contentView 添加更多对象。每个单元格都针对不同的目的进行定制,都遵循相同的格式。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
UIView *myContentView = self.contentView;
self.someLabel = [self newLabelWithColor:[UIColor blueColor] font:[UIFont boldSystemFontOfSize:12]];
[myContentView addSubview:self.someLabel];
self.someView = [UIView] alloc] init];
[myContentView addSubview:self.someView];
}
return self;
}
- (void)layoutSubviews
{
//Layout any views necessary
}
- (void)setupCell
{
self.someLabel = @"Placeholder Text";
self.someView.backGroundColor = [UIColor redColor];
}
想象一下标签只是单元格中的标题,视图是单元格左侧的一个小条,指示状态(实际代码具有确定不同颜色/状态的逻辑)。
最后一点信息是 MyTableViewController 似乎不想自行取消选择单元格。我在任何地方都没有 clearSelectionOnViewWillAppear = NO(默认状态为 YES),但是当我返回 TableViewController1、2 之一时,单元格仍保持选中状态。奇怪的是,3 没有这种行为,我不知道为什么。因此我实施
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
和取消选择的作品。如果我把它放在 viewWillAppear 中,它就不起作用。所以我的第一个问题是,有谁知道为什么会发生这种行为?UITableViewController 的标准行为是让一个单元格突出显示,然后在返回时取消选择它,以便提醒用户他们选择的内容,如联系人之类的。我想知道这个问题是否会导致我的下一个问题,这是帖子的主题。
当它们被取消选择时,这些单元格看起来很糟糕。流程是这样的 Return To TableView -> 单元格在选定状态下以蓝色突出显示 -> 单元格返回突出显示状态(所有文本均为白色,带有渐变背景,self.someView 仍然不可见)-> 单元格返回正常状态(文本是正常颜色和 self.someView 重新出现)。过渡根本不是流畅的,您可以清楚地看到单元格在这些状态中移动,其中与联系人一样,单元格平滑过渡,蓝色褪色并出现正常文本颜色。
这里有很多信息,实际上通过写这篇文章我已经了解了很多关于发生了什么的事情,但是我仍然很困惑这是取消选择的问题还是我的方式有问题'已经设置了单元格,或者这可能是我对 setSelected 和 setHighlighted 的覆盖中的问题。感谢您的帮助,考虑到这里的内容量,我真的很感激。