停止在UITableViewCell中重复值

时间:2014-03-13 01:31:46

标签: ios iphone objective-c uitableview

我用自定义的UITableViewCell类以编程方式创建了一个UITableViewCell,但由于某种原因,即使从NSMutableArray读取的值正确并且我在prepareForReuse方法中清除这些值,这些值也在UILabels中重复。自定义UITableViewCell类。

这就是cellForRow:AtIndexPath方法的样子

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellDictionary = [xmlMArray objectAtIndex:indexPath.row];
    static NSString *CellIdentifier = @"Cell";

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[MatchingCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // Configure the cell.
    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    cell.itemsDictionary = cellDictionary;
    cellDictionary = nil;
    [cell drawCell];

    return cell;   
}

然后在里面这就是我的自定义类看起来像

#import "MatchingCell.h"
#import "ScreenSize.h"

@implementation MatchingCell

@synthesize itemsDictionary;
@synthesize nameString;
@synthesize addressString;
@synthesize codeString;
@synthesize scrollCell;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        nameString = [[UILabel alloc] init];
        nameString.backgroundColor = [UIColor clearColor];

        addressString = [[UILabel alloc] init];
        addressString.backgroundColor = [UIColor clearColor];

        codeString = [[UILabel alloc] init];
        codeString.backgroundColor = [UIColor clearColor];

        scrollCell = [[UIScrollView alloc] init];
        scrollCell.backgroundColor = [UIColor whiteColor];

        [scrollCell addSubview:nameString];
        [scrollCell addSubview:addressString];
        [scrollCell addSubview:codeString];
        [self addSubview:scrollCell];
    }
    return self;
}

- (void)awakeFromNib
{
    // Initialization code
}

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

    // Configure the view for the selected state
}

- (void)drawCell
{
    nameString.frame = CGRectMake(15.0, 0.5, 70.0, 40.0);
    nameString.text = [itemsDictionary objectForKey:@"Name"];

    addressString.frame = CGRectMake(105.0, 0.5, 95.0, 40.0);
    addressString.text = [itemsDictionary objectForKey:@"Address"];

    codeString.frame = CGRectMake(220.0, 10.5, codeString.frame.size.width, 50.0);
    codeString.text = [NSString stringWithFormat:@"ISN %@: %@",[itemsDictionary objectForKey:@"CodeA"] ,[itemsDictionary objectForKey:@"CodeB"]];
    [codeString sizeToFit];

    scrollCell.frame = CGRectMake(0.0, 0.0, ScreenWidth, 45.0);
    [scrollCell setContentSize:(CGSizeMake((220.0 + codeString.frame.size.width)+15, 45.0))];


}

- (void)prepareForReuse
{
    [super prepareForReuse];

    nameString = nil;
    nameString.text = nil;
    addressString = nil;
    addressString.text = nil;
    codeString = nil;
    codeString.text = nil;

    itemsDictionary = nil;

    [self didTransitionToState:UITableViewCellStateDefaultMask];
}

@end

所以我的问题是当你将新的UITableViewCells滚动到视图中时,如何停止重复的值?

感谢。

2 个答案:

答案 0 :(得分:2)

在init中获取所有内容,然后将其移至drawCell:

您清除所有参考资料以准备重复使用,但由于这一点,它们永远不会重新创建:

if (cell == nil) {
    cell = [[MatchingCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

所以你的init只是第一次运行。

单元格仍然存在,但它的子视图都没有引用。

两个注释:

在删除引用之前,您应该从子视图中删除以准备重用。因为否则你会继续在子视图之上添加子视图,你会得到糟糕的表现。 (由@ user2891327建议)

您不应将视图直接添加到单元格,请将其.contentView属性用于子视图。

答案 1 :(得分:0)

出列后试试

 for (UIView* view in cell.subviews)
    [view removeFromSuperview];

如果有效,则表示您需要先删除子视图。