滚动时UITableView子视图出现在错误的部分?

时间:2011-09-11 20:27:13

标签: objective-c ios uitableview

在UITableView中,我添加了一个UIView作为子视图,但仅适用于第1节。第1节的内容是从plist加载的,而plist包含可变内容。如果有足够的行允许滚动,则会发生以下情况:我滚动到底部,然后备份,UITextField随机出现在0部分的单元格中。我不知道为什么会这样!所以我所做的就是这个(在'cellForRowAtIndexPath'中):

if (indexPath.section == 0) {
    //do stuff
}
else if (indexPath.section == 1) {
    d = [UIView alloc] init];
    [cell.contentView addSubview:d];
}

当我滚动时,这完全搞砸了。子视图出现在第0部分中,他们是shoudnt,在didSelectRowAtIdexPath我重新加载第1部分,然后子视图甚至出现两次(相互之间)......它是一个完整的MESS!拜托,请帮助.......

3 个答案:

答案 0 :(得分:5)

没有看到任何代码,这似乎是与可重用单元有关的问题。发生的情况是,滚动屏幕的单元格将重新用于要显示的新内容。所以我认为你需要在cellForRowAtIndexPath中对第0和第1节进行区分,并且基本上为它们使用不同的单元格集。

编辑:好的,我想在这里解决你的问题

UITableViewCell *cell;

if (indexPath.section == 0) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithoutSubview"];
    if (cell ==nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:@"CellWithoutSubview"] autorelease];
    }

    //do stuff with cell like set text or whatever
}
else if (indexPath.section == 1) {
    cell = [tableView dequeueReusableCellWithIdentifier:@"CellWithSubview"];
    if (cell ==nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:@"CellWithSubview"] autorelease];

        d = [[UIView alloc] init];
        [cell.contentView addSubview:d];
        [d release];
    }


}

return cell;

所以现在你将为tableview提供两种类型的单元格,这些单元格将被重用一个没有子视图,一个用于子视图。

答案 1 :(得分:1)

您必须使用dequeueReusableCellWithIdentifierdequeueReusableCellWithIdentifier的目的是减少使用内存。如果屏幕可以容纳4或5个表格单元格,那么重复使用时,即使表格有1000个条目,也只需要在内存中分配4或5个表格单元格。

因此UITableViewCell中的子视图也会被缓存。因此,当细胞被重复使用时,您需要清除旧视图和然后加入新内容。

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"your-id"];
if (cell)
{
     //reusing old cell. reset all subviews before putting new content.
}
else
{
     //Create a fresh new cell
}

答案 2 :(得分:-1)

您应该使用switch代替:

switch ( indexPath.section )
{
    case 0:
    {
        /* do soemthing */
    }
        break;
    case 1:
    {
        d = [UIView alloc] init];
        [cell.contentView addSubview:d];
    }
        break;
}