UITableView在滚动时重叠

时间:2013-11-01 13:32:39

标签: objective-c uitableview scroll overlapping

在我的故事板中,我有一个表格视图。 我正在使用从JSON文件加载的数据(在viewDidLoad中加载)填充该表视图。

在我的UITableView中,我确实将“原型单元格”设置为1,因此我可以轻松选择附件。 我的Prototype Cell有一个Seque到一个新视图,需要显示所选项目的详细信息。

我正在以编程方式填充我的单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *videoTableIdentifier = @"VideoCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:videoTableIdentifier];

    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:videoTableIdentifier];

    UILabel * title = [[UILabel alloc] initWithFrame:CGRectMake(40,5, 240,20)];
    [cell addSubview:title];
    [title setText:[[videos objectAtIndex:indexPath.row] objectForKey:@"title"]];

    UILabel * detail = [[UILabel alloc] initWithFrame:CGRectMake(40,28, 100,10)];
    [cell addSubview:detail];
    [detail setText:[NSString stringWithFormat:@"Year: %@", [[videos objectAtIndex:indexPath.row] objectForKey:@"year"]]];

    [cell addSubview:[[UIImageView alloc] initWithImage:[UIImage imageNamed:[[videos objectAtIndex:indexPath.row] objectForKey:@"image"]]]];

    return cell;
}

当我开始滚动时,会发生以下情况: enter image description here

所以我开始寻找解决方案,发现我必须将dequeueReusableCellWithIdentifier:videoTableIdentifier设置为“nil”。

虽然我这样做了,但这解决了我的问题,但是现在我的Prototype Cell Accessory和Seque已经不见了,所以我无法再导航到下一个视图了。

我无法在互联网上找到解决方案,所以我决定问这个问题。 如果有人可以提供帮助,那会很棒。

2 个答案:

答案 0 :(得分:6)

您的问题是,每次重新使用单元格时,都会向其添加新的子视图,因此如果您有一个带有某些标签的单元格,并且重复使用它并添加更多标签,则所有标签都会重叠。< / p>

我建议您制作带有标签的自定义UITableViewCell,每次只更改标签的值。

答案 1 :(得分:0)

if (!title){
    title = [[UILabel alloc] initWithFrame:CGRectMake(40,5, 240,20)];
    [cell addSubview:title];
} 
[title setText:[[videos objectAtIndex:indexPath.row] objectForKey:@"title"]];

以前的答案作者是对的。使用您自己的UITableViewCell子类可能更好 我没有看到任何内存释放。你在使用自动引用计数吗?