UITableView给出了奇怪的结果

时间:2010-07-28 14:48:43

标签: iphone cocoa-touch uitableview

我确定这将成为有人指出我正在做的事情非常明显的事情之一,但我不能为我的生活找到问题。基本上我有一个字符串数组,我在需要时将数组中的文本加载到我的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];
}

有人可以把我从痛苦中解救出来。非常感谢

4 个答案:

答案 0 :(得分:3)

每次配置单元格时,都会添加标签作为子视图。但是该单元可能会被重用并且之前已经配置过。您应该使用现有标签,例如textLabeldetailTextLabel,或者在新单元格的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.textLabelUITableViewCell的其他现有成员来显示您的数据。

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];
}