1

UILabels に配列をリストするセルを含むテーブルを作成しようとしています。したがって、各セルには、その配列内のオブジェクトの数によって決定されるラベルのサイズと量があります。ただし、コンテンツが最初に正しく入力されるという問題が発生していますが、スクロール中に表のセルがリサイクルされると、コンテンツがクリアされません。

壊れた UITableView オーバーラップ セル コンテンツ

これが私の実装全体です。リサイクル プロセス中にラベルが保持されないようにする方法について、誰かが説明していただければ幸いです。ありがとうございました。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    UITableView *tableView;
}

@end

ViewController.m

#import "ViewController.h"
#import "CustomCell.h"

@interface ViewController () {
    NSArray *myTableArray;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set up View
    self.view = [[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame];
    self.view.backgroundColor = [UIColor whiteColor];
    self.view.clipsToBounds = YES;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    // Set up Table
    CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    tableView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
    tableView.backgroundColor = [UIColor clearColor];
    tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    tableView.dataSource = self;
    tableView.delegate = self;
    [tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"CustomCell"];
    [self.view addSubview:tableView];

    //Set up dummy array for cells (in my actual app I'm pulling from Core Data)
    NSArray *cell1 = [[NSArray alloc]initWithObjects:@"Some Text", nil];
    NSArray *cell2 = [[NSArray alloc]initWithObjects:@"Different", @"Text", nil];
    NSArray *cell3 = [[NSArray alloc]initWithObjects:@"Lorem...", nil];
    NSArray *cell4 = [[NSArray alloc]initWithObjects:@"Thanks", @"for your", @"help", nil];
    NSArray *cell5 = [[NSArray alloc]initWithObjects:@"A bit more", @"text", nil];
    NSArray *cell6 = [[NSArray alloc]initWithObjects:@"Bunch of", @"junk text", nil];
    NSArray *cell7 = [[NSArray alloc]initWithObjects:@"So long", @"and thanks", @"for all", @"the fish", nil];
    NSArray *cell8 = [[NSArray alloc]initWithObjects:@"Ipsum..", nil];
    NSArray *cell9 = [[NSArray alloc]initWithObjects:@"Peter Pan", @"killed", @"The Lost Boys", nil];
    NSArray *cell10 = [[NSArray alloc]initWithObjects:@"All Dogs", @"Go to Heaven", @"Disney", nil];
    myTableArray = [[NSArray alloc]initWithObjects:cell1, cell2, cell3, cell4, cell5, cell6, cell7, cell8, cell9, cell10, nil];
    NSLog(@"%@",myTableArray);

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return myTableArray.count;
}

- (CGFloat)tableView:(UITableView *)table heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSArray *arr = [myTableArray objectAtIndex:indexPath.row];
    return 60 * arr.count;
}

- (UITableViewCell*)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"CustomCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell)
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    // Set up the labels
    [cell setLabels:myTableArray[indexPath.row]];

    return cell;
}


@end

CustomCell.h

#import <UIKit/UIKit.h>

@interface CustomCell : UITableViewCell
- (void)setLabels:(NSArray *)labels;
@end

CustomCell.m

#import "CustomCell.h"

@implementation CustomCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (void)setLabels:(NSArray *)labels {
    int labelHeight = 60;
    int y = 0;
    for (NSString *string in labels) {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, y, self.bounds.size.width-20, labelHeight)];
        label.text = string;
        label.font = [label.font fontWithSize:20];
        y += labelHeight;
        [self.contentView addSubview:label];
    }
}
@end
4

3 に答える 3

10

あなたのCustomCell.m

- (void)prepareForReuse {
    [super prepareForReuse];
    for(UIView *subview in [self.contentView subviews]) {
        [subview removeFromSuperview];
    }
}

prepareForReuseテーブル ビューが再利用のためにセルをデキューするときに、セルに対して呼び出されるメソッドです。

Leo Natan が提案したように、既存のラベルを使用する必要があるため、実際に行っていることを非常に単純化した例に最小限に抑えたと仮定します。

于 2014-01-25T03:34:30.300 に答える
3

UILabelこれは、古いサブビューを削除せずに新しいサブビューを追加しているためです。

なぜ新しいラベルを追加するのですか? 既存のラベルを使用します。を使用しているためUITableViewCellStyleDefault、セルには既に複数のラベルが含まれています。self.textLabel.text = string代わりに使用してください。

カスタム ラベルを引き続き使用する場合は、セル内のすべてのサブビューを削除する必要がありますprepareForReuse( のスーパー実装を呼び出すことを忘れないでくださいprepareForReuse)。セルを として定義したため、UITableViewCellStyleDefault削除してはならない他のサブビューがあることを覚えておいてください。

于 2014-01-25T03:34:24.597 に答える
-1

再利用されたセルにラベルを追加する前に、すべてのラベルを削除する必要があります。

- (UITableViewCell*)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"CustomCell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell)
        cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    for (UIView * subView in [cell.contentView subviews]) {
        if ([subView isKindOfClass:[UILabel class]]) {
            [subView removeFromSuperview] ;
        }
    }

    // Set up the labels
    [cell setLabels:myTableArray[indexPath.row]];

    return cell;
}
于 2014-01-25T03:34:47.853 に答える