UITableView自定义节标题,重复的问题

时间:2010-02-28 03:54:28

标签: iphone uitableview animation sectionheader

我无法设置自定义UITableView节标题的动画。
目标是创建可折叠部分。
当我第一次按照预期动画时点击自定义标题,然而每次之后它会在原始位置留下副本并为另一个设置动画。

图片示例:

alt text http://img35.imageshack.us/img35/4018/screenshot2010022722565.png alt text http://img291.imageshack.us/img291/8287/screenshot2010022723035.png     
   我的自定义标题:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
       UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
       customView.backgroundColor = [UIColor lightGrayColor];

       UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
            headerLabel.backgroundColor = [UIColor clearColor];
            headerLabel.opaque = NO;
            headerLabel.textColor = [UIColor darkGrayColor];
            headerLabel.font = [UIFont boldSystemFontOfSize:16];
            headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
            headerLabel.textAlignment = UITextAlignmentCenter;
            NSDictionary *dictionary = [self.data objectAtIndex:section];
            headerLabel.text = [dictionary objectForKey:@"Title"];

            [customView addSubview:headerLabel];


            // add button to right corner of section
        UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
            headerButton.center = CGPointMake( 160.0, 22.0);
            headerButton.backgroundColor = [UIColor clearColor];
            headerButton.tag = section;
            [headerButton   addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];

            [customView addSubview:headerButton];

            return customView;
}

我的动画方法:

- (void) expandSection:(id)sender {

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

我不确定最新情况,但实例表明我需要处理一些问题。我尝试过一些东西,但我无法弄清楚这一点。任何有关这方面的帮助都会很棒!

编辑:我认为问题是reloadSections导致自定义视图实例化。我无法释放视图,因为我需要它作为动画更新的参考。关于我能做些什么来解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:8)

找到解决方案。

每次更改前都需要重新加载表格。这样,在进行任何更改之前,表格处于最新状态。

添加 [self.tableView reloadData]; 作为“expandSection”方法中的第一个条目。

CODE:

- (void) expandSection:(id)sender {

  [self.tableView reloadData];

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

答案 1 :(得分:2)

我有一个类似的问题,这是由使用动态高度单元格引起的。我有一个可扩展的自定义标题视图,当我更新tableView以插入和删除该节的相关行(意味着它们正在展开,分别折叠)时,作为UITableViewHeaderFooterView的子类的节标题未被回收。所以基本上新的一个被分配并添加到旧的一个导致重叠的视图。单元标识符已正确设置,因此必须是其他内容。当我删除tableView.sectionHeaderHeight = UITableViewAutomaticDimension并实施func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat后,视图得到了正确回收,每个部分只显示了一个标题视图。

我实际工作的另一个解决方案是使用UITableViewCell代替UITableViewHeaderFooterView,当您func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?返回return cell.contenView时,这将有效,因为方法需要返回一个UIView,因为UITableViewCell的contentView是一个UIView它可以正常工作。其背后的想法是通过UITableViewCell使用UITableView的回收机制,并在配置后返回其内容。

结论。问题很可能由UITableViewHeaderFooterView引起,与自定义tableView单元格和UITableViewAutomaticDimension一起使用,而不是手动计算单元格高度。