2

这是有问题的应用程序部分的设置。

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 的覆盖中的问题。感谢您的帮助,考虑到这里的内容量,我真的很感激。

4

0 回答 0