在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!拜托,请帮助.......
答案 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)
您必须使用dequeueReusableCellWithIdentifier
。 dequeueReusableCellWithIdentifier
的目的是减少使用内存。如果屏幕可以容纳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;
}