dequeueReusableCell导致奇怪的行为

时间:2011-10-21 09:58:50

标签: ios

我正在创建一个类似于bbc应用程序的iOS应用程序 - 我有一个有两个部分的桌子视图 - 第1部分包含包含scrollview wid图像的单元格 - 第2部分包含可扩展单元格,其中包含scrollview执行的图像 所以问题就在于此 当我使用dequereusable时它表现出奇怪的行为,比如当表格中最底层的单元格被扩展时,第一个单元格被清除等等 所以我刚刚停止使用队列,一切都开始正常 但是现在当我在滚动后添加图像时,不在视图中的单元格会被刷新 花了很多时间加载

所以可以指导我如何在代码中明智地使用队列 如下面所描述的 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSString *CellIdentifier=@"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell== nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"hai"] autorelease];

/// [这里使用了不同的名称作为重用标识符]; ////

      if ([self tableView:tableView inSection2:indexPath.section]) {
        Coffee *co =[appDelegate.coffeeArray2 objectAtIndex:indexPath.section-s1Count-1];
         cell.textLabel.text=co.coffeeName;

    }

    if ([self tableView:tableView inSection1:indexPath.section]) {

        Coffee *co =[appDelegate.coffeeArray1 objectAtIndex:indexPath.section];
        cell.textLabel.text = co.coffeeName;
        CGRect cellname = CGRectMake(5, 0, 290, 25);
        UILabel *cellabel = [[[UILabel alloc] initWithFrame:cellname] autorelease];

        cellabel.backgroundColor = [UIColor whiteColor];

        cellabel.font = [UIFont italicSystemFontOfSize:20];

        cellabel.textColor=[UIColor blueColor];

        cellabel.highlightedTextColor = [UIColor clearColor];

       cellabel.text=co.coffeeName;

        [cell.contentView addSubview:cellabel];


    }


// Configure the cell...

if ([self tableView:tableView canCollapseSection:indexPath.section]) 

{
    if (!indexPath.row)

    {     

        // first row

       // only top row showing



        if ([expandedSections containsIndex:indexPath.section])

        {

            cell.accessoryView = [myuicontroller accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeUp];

        }

        else

        {

            cell.accessoryView = [myuicontroller accessoryWithColor:[UIColor grayColor] type:DTCustomColoredAccessoryTypeDown];

        }





    }

    else

    {

        // all other rows

        cell.accessoryView = nil;    

        cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;


        CGRect cellname = CGRectMake(5, 0, 290, 25);

        UILabel *cellabel = [[[UILabel alloc] initWithFrame:cellname] autorelease];

        cellabel.backgroundColor = [UIColor whiteColor];

        cellabel.font = [UIFont italicSystemFontOfSize:13];

        cellabel.textColor=[UIColor blueColor];

        cellabel.highlightedTextColor = [UIColor clearColor];

       // cellabel.text =[NSString stringWithFormat:@"category"];

        [cell.contentView addSubview:cellabel];

        myscrollView *svb;
           svb=[[myscrollView alloc]initwitharray:appDelegate.newscat1];

}else{

    myscrollView *s;

    NSLog(@"inside the textlabel ext%@",cell.textLabel.text);

    NSLog(@"count of array  %d",[appDelegate.newscat1 count]);

    NSString *cat=cell.textLabel.text;

            [cell.contentView addSubview:s];

}

}   



return cell;

}

1 个答案:

答案 0 :(得分:1)

您需要在出列单元格之前设置备用重用标识符。当您将具有标识符“cell”的单元格出列时,无论您所在的部分如何,因此您通常会返回第0部分单元格,用于表格的第1部分。

因此,根据indexPath.section

的值,对代码进行分支,以便执行不同的操作
if (indexPath.section == 0)
    cellIdentifier = @"thisCell";
else
    cellIdentifier = @"otherCell";

然后将您的单元格出列,如果为nil,则使用上面相同的单元格标识符变量创建。

你应该只在你的(cell = nil)代码中添加子视图 - 否则你将最终得到具有大量重叠子视图的单元格,并且会浪费内存。如果单元格已经出列,您只需配置现有的子视图,而不是创建新的子视图。您可以在添加标记时为子视图指定标记以协助执行此操作。