我确定这将成为有人指出我正在做的事情非常明显的事情之一,但我不能为我的生活找到问题。基本上我有一个字符串数组,我在需要时将数组中的文本加载到我的uitableviewcells中。当我开始滚动时出现问题,出于某种原因,第6个单元格,即第7个单元格从数组位置6的文本顶部显示数组位置0的文本,当我向后滚动单元格0中的文本后面或者(我不能完全告诉)阵列位置6的文字!! ??我不知道我是怎么做的。这是我的代码:
NSMutableArray *titles1 = [[NSMutableArray alloc]initWithCapacity:10];
[titles1 insertObject:[NSString stringWithFormat:@"0"] atIndex:0];
[titles1 insertObject:[NSString stringWithFormat:@"1"] atIndex:1];
[titles1 insertObject:[NSString stringWithFormat:@"2"] atIndex:2];
[titles1 insertObject:[NSString stringWithFormat:@"3"] atIndex:3];
[titles1 insertObject:[NSString stringWithFormat:@"4"] atIndex:4];
[titles1 insertObject:[NSString stringWithFormat:@"5"] atIndex:5];
[titles1 insertObject:[NSString stringWithFormat:@"6"] atIndex:6];
[titles1 insertObject:[NSString stringWithFormat:@"7"] atIndex:7];
[titles1 insertObject:[NSString stringWithFormat:@"8"] atIndex:8];
[titles1 insertObject:[NSString stringWithFormat:@"9"] atIndex:9];
self.secretTitles = titles1;
[titles1 release];
//自定义表格视图单元格的外观。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
}
// Configure the cell.
cell.selectedBackgroundView.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
secretName = [[UILabel alloc]initWithFrame:(CGRectMake(10, 8, 100, 30))];
secretName.backgroundColor = [UIColor clearColor];
secretName.textColor = [UIColor whiteColor];
secretName.font = [UIFont boldSystemFontOfSize:18];
secretName.shadowColor = [UIColor colorWithRed:0./255 green:0./255 blue:0./255. alpha:0.7];
secretName.shadowOffset = CGSizeMake(0, 2.0);
secretName.text = @"";
NSLog(@"row = %d", indexPath.row);
secretName.text = [self.secretTitles objectAtIndex:indexPath.row];
[cell.contentView addSubview:secretName];
}
有人可以把我从痛苦中解救出来。非常感谢
朱
答案 0 :(得分:3)
每次配置单元格时,都会添加标签作为子视图。但是该单元可能会被重用并且之前已经配置过。您应该使用现有标签,例如textLabel
和detailTextLabel
,或者在新单元格的alloc-and-init之后创建单元格时添加标签secretName
。然后在configureCell
中,您只需设置标签的文字。
答案 1 :(得分:3)
每次(重新)使用单元格时,您都会向单元格的内容视图添加新标签,因此最终会将多个标签放在彼此的顶部。正确的方法是只添加一次标签,然后为其设置文本值:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
UILabel *secretName = [[UILabel alloc]initWithFrame:(CGRectMake(10, 8, 100, 30))];
secretName.backgroundColor = [UIColor clearColor];
secretName.textColor = [UIColor whiteColor];
secretName.font = [UIFont boldSystemFontOfSize:18];
secretName.shadowColor = [UIColor colorWithRed:0./255 green:0./255 blue:0./255. alpha:0.7];
secretName.shadowOffset = CGSizeMake(0, 2.0);
secretName.tag = 100; // Arbitrary value that you can use later
[cell.contentView addSubview:secretName];
[secretName release]; // Do not forget to release the label!
}
// Configure the cell.
cell.selectedBackgroundView.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UILabel* label = (UILabel*)[cell.contentView viewWithTag:100];
label.text = [self.secretTitles objectAtIndex:indexPath.row];
return cell;
}
答案 2 :(得分:1)
您正在为每个单元格添加子视图。单元对象被重用。由于API不知道您对单元格的影响,因此您无需修改任何内容,旁边的标准,这是您的责任。
您应该使用cell.textLabel
或UITableViewCell
的其他现有成员来显示您的数据。
OR:废除了重复使用的单元格,但这在性能方面做起来并不聪明。
答案 3 :(得分:1)
您需要了解UITableView重新使用单元格的方式。您的代码中发生的事情是您将secretName
添加到已有代码的单元格中。这是对代码的快速重写:
//we need a way to find the secretName UILabel in the cell's contentView
enum {
kSecretNameTag = 255
};
(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
// we only need to set up the cell when we create it
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.selectedBackgroundView.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[self configureCell:cell];
}
// grab the secretName UILabel and set the text
UILabel* secretName = [cell viewWithTag:kSecretNameTag];
secretName.text = @"";
NSLog(@"row = %d", indexPath.row);
secretName.text = [self.secretTitles objectAtIndex:indexPath.row];
return cell;
}
(void)configureCell:(UITableViewCell *)cell {
secretName = [[UILabel alloc]initWithFrame:(CGRectMake(10, 8, 100, 30))];
secretName.backgroundColor = [UIColor clearColor];
secretName.textColor = [UIColor whiteColor];
secretName.font = [UIFont boldSystemFontOfSize:18];
secretName.shadowColor = [UIColor colorWithRed:0./255 green:0./255 blue:0./255. alpha:0.7];
secretName.shadowOffset = CGSizeMake(0, 2.0);
secretName.tag = kSecretNameTag;
[cell.contentView addSubview:secretName];
}