UITableView自定义单元格中的问题

时间:2010-08-23 17:58:32

标签: iphone objective-c uitableview uilabel

我正在尝试在UITableView中为我的单元格添加自定义标签。当我尝试这样做时,显示器搞砸了,我无法弄清楚到底发生了什么。请找到下面的图片,我将发布我写的方法..

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //cell.textLabel.font=[UIFont systemFontOfSize:16];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    NSString *contact=[contactKeys objectAtIndex:[indexPath section]];
    NSArray *contactSection=[contactNames objectForKey:contact];
    NSMutableArray *sugar=[db sugarId];

    if (isSearchOn) { 
        NSString *cellValue = [searchResult objectAtIndex:indexPath.row]; 
        NSArray *splitText = [cellValue componentsSeparatedByString:@":"];
        NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];
        //NSString *result=[contactText stringByAppendingString:[sugar objectAtIndex:[indexPath row]]];
        firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];                                                  
        firstLabel.tag =40; //This should be a constant probably
        firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
        firstLabel.text = contactText;
        [firstLabel sizeToFit];
        [cell.contentView addSubview:firstLabel];

        sugarLabel = [[UILabel alloc] initWithFrame:
                      CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
        sugarLabel.tag =40; //This should be a constant probably
        //sugarLabel.font = [UIFont boldSystemFontOfSize:16];
        sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
        [sugarLabel setHidden:YES];        
        [cell.contentView addSubview:sugarLabel];


        cell.textLabel.text =firstLabel.text;
        } else {
         NSString *cellText = [contactSection objectAtIndex:[indexPath row]];

            // split the text by the : to get an array containing { "AAA", "BBB" }
            NSArray *splitText = [cellText componentsSeparatedByString:@":"];

            // form a new string of the form "BBB AAA" by using the individual entries in the array
            NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];

            firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];                                                  
            firstLabel.tag =40; //This should be a constant probably
            //firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
            firstLabel.text = contactText;
            [firstLabel sizeToFit];
            [cell.contentView addSubview:firstLabel];

            sugarLabel = [[UILabel alloc] initWithFrame:
                                    CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
            sugarLabel.tag =40; //This should be a constant probably
            //sugarLabel.font = [UIFont boldSystemFontOfSize:16];
            sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
            [sugarLabel setHidden:YES];        
            [cell.contentView addSubview:sugarLabel];

            NSString *result=[NSString stringWithFormat:@"%@ %@",firstLabel.text,sugarLabel.text];
            cell.textLabel.text=result;

    }

alt text

图2:这是对BP建议的代码的修改。结果在这里...... alt text

修改

每当我尝试编写stringWithFormat或上述语句时,内存都不会被释放,并且标签会相互重叠。有没有办法解决这个问题..请帮助我..我花了半天多的时间试图弄清楚但没有运气

3 个答案:

答案 0 :(得分:2)

如果你想拥有自定义单元格,我建议你继承UITableViewCell。在您给出的示例代码中,每次tableview要求索引路径中的行的单元格时,您都在创建新标签。当你自动释放它们时,你也会添加它们的单元格的内容视图,这会增加它们的保留计数并确保它们的生命周期和tableview的一样长。

当重复使用单元格时,您将继续向其内容视图添加越来越多的标签,直到最终内存不足为止。

就奇怪的文本输出而言,看起来您正在使用格式调用的字符串添加UILabel。

如果您要执行类似下面的代码,您会看到类似的内容。

UILabel *label = [[UILabel alloc] init];
NSLog(@"%@", label);
[label release];

编辑:看到你编辑过的截图,我假设你向下滚动到'S'部分。在这种情况下,您会在其他标签上看到标签。就像我提到的那样,您每次都会创建一个新标签,并将其放在您创建第一个(以及第二个,第三个等)时间的标签之上。

答案 1 :(得分:2)

你获得UILabel:...项目的原因是方法的最后一行,你设置了cell.textLabel.text。如果要创建包含自己字段的单元格,则不希望这样做。

答案 2 :(得分:2)

NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel]

应为:

NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel.text]

您传入的是UILabel,而不是NSString

修改

尝试仅在if (cell == nil) {块中实例化和添加UILabel。

访问标签属性并在此块外写入是正常的