1

まず第一に、これが重複していると言わないでください。私はこの質問が何度も尋ねられ、答えられたことを知っていますが、他のみんなの解決策を読んだ後でも、私のコードを機能させることができないようです。

UILabelサブビューを含むUITableViewCellに問題があります。UILabelは、特定のセルからスクロールして戻るまで、特定のセルに表示されない場合があります。セルをカスタマイズするために使用しているコードは次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UILabel *label;

if (cell == nil) {

    // cell is nil, create it

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];


    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    label.tag = 888;

} else {

    label = (UILabel*)[cell.contentView viewWithTag:888];
    [label removeFromSuperview];

}

label.text = @"Label Text";
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
[cell.contentView addSubview:label];

// customize cell text label
cell.textLabel.text = @"Cell Text";
cell.textLabel.textColor = [UIColor darkGrayColor];

return cell;
}

dequeueReusableCellWithIdentifier:CellIdentifierがnil以外の値を返すと、ラベルが正しく表示されるように見えますが、戻り値がnilであり、新しいセルをインスタンス化する必要がある場合は表示されません。

なぜこれが起こっているのか誰かが知っているなら、助けていただければ幸いです。

4

4 に答える 4

1

あなたがやりたいことがいくつかあります。

1)「sizeToFit」を読んでください-説明には、ビューにスーパービューがない場合、奇妙な結果が得られる可能性があると記載されています。

2)ビューを作成したら、すぐにセルに追加します。

3)セルのサイズを変更した後、そのサイズを取得し、適切なフレームを計算します。「中央」を使用しないことをお勧めしますが、コードが実際に機能しないかどうかはわかりません。

4)中心を変更してフレームを変更する前に、次のようにハードコーディングします。

CGRect r = label.frame;
r.origin = (CGPoint){ 20, 20 };
label.frame = r;

これにより、少なくとも新しいセルと古いセルが適切に機能していることがわかります。次に、本当に必要なフレームを計算するか、さらに中心で遊ぶことができます。

于 2012-07-19T23:21:52.620 に答える
0

問題はcell.textLabelの変更にあるようです。このサイトの他の投稿では、このラベルが変更されるたびに、新しいラベルが実際に作成され、セルのコンテンツビューに追加されることが示唆されています(既存のラベルを変更するだけではありません)。設定cell.textLabel.backgroundColor = [UIColor clearColor];により問題が解決したようです

カスタムラベルサブビューを最後に追加しても(cell.textLabelのプロパティを設定した後)、問題は修正されなかったため、これについてはまだ少し混乱しています。cell.textLabelの背景色をtransparent/clearに設定する必要がありました。

于 2012-07-19T23:48:23.430 に答える
0

問題の原因はわかりませんが、いくつかの改善を行うことができます。たぶんそれらの1つが問題を修正します:

  1. dequeuシナリオでは、ラベルをビューから削除して、再度追加するだけです。代わりに、ビュー階層に残しておく必要があります。

  2. ラベルのサイズを変更したり移動したりする必要がないようにするため。十分に広くして、テキストを右揃えにしてください。そうすれば、デキューシナリオでラベルのサイズを変更したり移動したりする必要がありません。

于 2012-07-19T23:22:25.857 に答える
0

場違いなものが3つあります。

if (cell == nil) { // cell is nil, create it

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:CellIdentifier];

    label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    label.tag = 888;
    [cell.contentView addSubview:label]; // (1) DO THIS HERE

} else {

    label = (UILabel*)[cell.contentView viewWithTag:888];
    // (2) DON'T DO THIS:  [label removeFromSuperview];

}

label.text = @"Label Text";
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
label.center = CGPointMake(cell.contentView.frame.size.width-label.frame.size.width/2-20, cell.contentView.frame.size.height/2);
// (3) DON'T DO THIS HERE: [cell.contentView addSubview:label];
....

ARCがオンになっていると思います。そうでない場合は、contentViewに追加した後に[ラベルリリース]が必要です。

于 2014-07-16T05:10:45.613 に答える