iOS:未使用重用标识符清除单元格内容

标签 ios objective-c uitableview reuseidentifier

我正在尝试使用列出 UILabel 中的数组的单元格构建一个表。因此,每个单元格的大小和标签数量由该数组中的对象数量决定。但是,我遇到了一个问题,内容最初输入正确,但是随着表格单元格在滚动过程中被回收,内容并不清楚。

Broken UITableView overlapping cell content

这是我的整个实现。如果有人可以请给我一个解释,说明如何防止标签在回收过程中被保留,我将不胜感激。谢谢你。

View Controller .h

#import <UIKit/UIKit.h>

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

@end

View Controller .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

自定义单元格.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

最佳答案

在您的 CustomCell.m :

- (void)prepareForReuse {
    [super prepareForReuse];
    for(UIView *subview in [self.contentView subviews]) {
        [subview removeFromSuperview];
    }
}
prepareForReuse是一种在单元格上调用的方法,因为表格 View 正在将它们出列以供重用。

我假设您已将实际操作最小化为一个非常简单的示例,因为否则,正如 Leo Natan 所建议的那样,您应该简单地使用现有标签。

关于iOS:未使用重用标识符清除单元格内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346225/

相关文章:

ios - fatal error : Unable to get your client ID

objective-c - 如何在不进入编辑模式的情况下直接编辑UITableView中的一行

iOS - UITableView 显示错误的单元格星数

ios - ImageView 不遵守约束

ios - GLKit 中的深度测试

objective-c - @selector - 如何从另一个类调用方法?

ios - 隐藏取消隐藏 UITableViewCell 背景

ios - Spritekit - Tableview 滚动中断

ios - 在 Windows 中测试 iOS PhoneGap 应用程序

ios - 单选 UITableView 叠加单元格