我用自定义的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滚动到视图中时,如何停止重复的值?
感谢。
答案 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];
如果有效,则表示您需要先删除子视图。