如何删除以前的子视图并将新的子视图添加到UITableviewCell

时间:2013-12-09 02:42:44

标签: objective-c uitableview

我创建了可以展开和折叠的单元格,当单元格展开时,我添加了2个子视图,并在单元格折叠时删除了这2个子视图。看一下代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if(selectedIndex == indexPath.row){
        selectedIndex = -1;

        UITableViewCell *cell = [self.tblView cellForRowAtIndexPath:indexPath];
        [[cell viewWithTag:TAG_KHMER] removeFromSuperview];
        [[cell viewWithTag:TAG_KOREAN] removeFromSuperview];

        //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [self.tblView beginUpdates];
        [self.tblView endUpdates];

        return;
    }

    if(selectedIndex >= 0){
        NSIndexPath *previousPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
        selectedIndex = indexPath.row;
        UITableViewCell *cell = [self.tblView cellForRowAtIndexPath:previousPath];
        [[cell viewWithTag:TAG_KHMER] removeFromSuperview];
        [[cell viewWithTag:TAG_KOREAN] removeFromSuperview];
        //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    VocabularyController *vc = [self.vocabularyInfo objectAtIndex:indexPath.row];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    UILabel *khmerLabel = [[UILabel alloc] init];
    khmerLabel.text = vc.khmer;
    khmerLabel.font = [UIFont fontWithName:@"Hanuman" size:17];
    [khmerLabel setNumberOfLines:0];
    khmerLabel.tag = TAG_KHMER;
    khmerLabel.frame = CGRectMake(20, 45, 300, 300);

    UILabel *koreanPro = [[UILabel alloc] init];
    koreanPro.text = vc.korean;
    [koreanPro setNumberOfLines: 0];
    koreanPro.tag = TAG_KOREAN;
    koreanPro.frame = CGRectMake(20, 315, 300, 300);

    [cell addSubview:khmerLabel];
    [cell addSubview:koreanPro];

    selectedIndex = indexPath.row;

    //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    [self.tblView beginUpdates];
    [self.tblView endUpdates];

}

发生的事情是细胞似乎没有移除前一个细胞。它在旧文本上显示新文本,但是当我再次点击同一个单元格两次,然后单元格可以渲染文本。

任何人都可以帮我如何正确显示它。

enter image description here

在单元格上单击两次后。

enter image description here

1 个答案:

答案 0 :(得分:2)

不要试图添加这样的子视图 - 这会导致混乱,因为你发现UITableView会回收细胞。

相反,创建您自己的自定义UITableViewCell子类,可以在您需要的各种状态之间切换,并且已经设置了所有子视图。您可以通过多种方式执行此操作 - 如果您使用的是故事板,则可以使用原型单元格,或者您可以使用NIB,或者您可以完全在代码中创建自定义子类(无论您最熟悉哪种方式)。

基本上,不要在表视图委托/数据源调用中向子单元添加子视图。创建一个自定义子类,您将更容易找到所有内容。