删除行时,添加到自定义部分标题视图的按钮会消失

时间:2010-12-16 17:10:36

标签: iphone cocoa-touch uitableview ios uikit

在我的应用中遇到了一些非常奇怪的行为。我在最简单的情况下重新创建了问题:

NSMutableArray *data;

- (void)viewDidLoad {
    [super viewDidLoad];
    data = [[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil] retain];
}

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)];
    header.backgroundColor = [UIColor lightGrayColor];
    [header addSubview:self.button];
    return header;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {    
        [data removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
    cell.textLabel.text = [data objectAtIndex:indexPath.row];
    return cell;
}

- (void)dealloc {
    [super dealloc];
}

每次删除一行;我标题中的按钮消失了!无论我使用什么类型的rowAnimation,都会发生这种情况。如果我向上滚动表格以使标题滚动;标题返回时按钮返回。该按钮在xib文件中创建。

我可以通过以下两种方式解决这个问题:

  • 删除后重新加载tableView数据;延迟,以便删除动画首先完成。
  • 在viewForHeaderInSection中而不是在interfaceBuilder中创建按钮。

    我真的很想了解这里发生了什么。按钮在哪里?我已经确认删除行时会调用viewForHeaderInSection。

编辑我尝试更改它以便按钮在viewForHeader中创建,而不是在xib中创建,但它会导致其他奇怪的问题...当我创建或删除按钮时,我正在设置某些属性,如标题和启用,具体取决于表中有多少项。当我删除表格中的最后一行时,我没有看到文本更新和启用状态,直到我从屏幕上滚动按钮再重新开启。

3 个答案:

答案 0 :(得分:1)

因为您只有一个按钮实例,如果表视图决定创建一个新的标题视图,那么该按钮将从其当前父项中删除并移动到新项。即使您的表中只有一个部分,表视图也可能在内部执行一些奇怪的操作并在屏幕外重新创建标题视图,因此您不能仅依赖于任何一个存在的部分。

viewForHeaderInSection:中创建按钮并解决其他问题。您应该处理任何删除事件,而不是仅更新viewForHeaderInSection中的按钮属性,以便删除行也会更新按钮。

答案 1 :(得分:0)

您对委托方法tableView:heightForHeaderInSection:的实施在哪里?这是tableView:viewForHeaderInSection:正常工作所必需的。检查文档。 Reference for UITableView delegate

  

我已经证实了这一点   当调用viewForHeaderInSection时   我删除了一行。

您是否确认使用添加的按钮为特定标头调用了viewForHeaderInSection? 然后,尝试添加

[header bringSubviewToFront:self.button];  

添加按钮后。

答案 2 :(得分:0)

好吧,我至少设法解决了我的问题......我为我在viewForheaderAtSection创建的视图创建了一个iVar和属性,然后我只创建一个新视图,如果我没有已经。否则我只是返回我已经拥有的标题;像这样的东西:

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    if (!self.myHeader){
        UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)];
        header.backgroundColor = [UIColor lightGrayColor];
        [header addSubview:self.button];
        self.myHeader = header;
        [header release];
    }
    return self.myHeader;
}

这样可行,但了解到底发生了什么仍然很棒。据我所知,viewForHeaderInSection是由系统调用的,但是我在该方法中返回的视图实例实际上并没有被使用/显示;至少在我做一些导致视图重绘的事情之前......