これは、問題が発生しているアプリの部分のセットアップです。
MyTableViewController は、私のカスタム UITableViewController クラスです。
TableViewController1、2、および 3 はすべて MyTableViewController 型です。1 と 2 はタブバー コントローラーによって制御されるビュー コントローラーで、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 の標準的な動作は、セルを強調表示したままにし、戻ったときに選択を解除して、連絡先などで見られるように、ユーザーが選択したものを思い出させることです。この問題が、投稿のトピックである次の問題につながるかどうか疑問に思っています。
セルの選択を解除すると、セルの見た目が悪くなります。フローは次のようになります。 TableView に戻る -> セルが選択された状態で青色に強調表示される -> セルが強調表示された状態に戻る (すべてのテキストはグラデーションの背景で白く、self.someView はまだ非表示) -> セルが通常の状態に戻る (テキスト通常の色で、self.someView が再表示されます)。遷移はまったく流動的ではなく、セルがこれらの状態を移動していることがはっきりとわかります。連絡先の場合と同様に、セルは青色のフェードと通常のテキスト色の表示でスムーズに遷移します.
ここにはたくさんの情報があり、実際にこの投稿を書いて何が起こっているのかについて多くのことを学びましたが、それが選択解除の問題なのか、それとも私のやり方の問題なのか、まだ混乱しています.セルを設定したか、setSelected と setHighlighted のオーバーライドに問題がある可能性があります。ここのコンテンツの量を考えると、本当に感謝しています。