UITableView删除部分 - 标题保持可见

时间:2013-01-24 09:24:08

标签: ios objective-c cocoa-touch uitableview

在不在视图的部分使用[UITableView deleteSections:withRowAnimation:]后,部分标题仍然可见。

在此图片上,我们看到了tableview的可见部分

enter image description here

在下一张图片中,我们看到整个tableview - AISLE 2被隐藏,直到用户向下滚动,它只包含一行:

enter image description here

当我向下滚动并删除最后一行时,即使我使用deleteSections,AISLE 2部分标题仍然可见。如果我从AISLE 1中删除一行,则节标题仍保留在同一位置,通过向下滚动我仍然可以看到它。

此外,当尝试向下滚动以便AISLE 2标题位于视图中时,用作AISLE2的UI不是tableview的一部分,并立即向上滚动。这意味着 - 这是一个垃圾视图,显然不是表的一部分,因为我删除了它。出于某种原因,iOS不会删除此视图,而是将其从表中取消关联。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

[tableview reload]设为1,尝试numberofsections

答案 1 :(得分:0)

您的数据来自哪里?您如何知道一开始有多少部分?我认为通过解释这个问题很容易解决你的问题。

看起来您可能有一个多维数nsmutablearray,其中每个索引都是过道,每个对象都包含该岛的产品?或者你可以为每个过道使用不同的数组?

删除单元格时,只需检查剩余的单元格数,然后调用[self.tableView reloadData];

对于(假设的)例子;

如果你有过道的阵列:

NSMutableArray *aisleOne = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
NSMutableArray *aisleTwo = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
NSMutableArray *aisleThree = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];
NSMutableArray *aisleFour = [[NSMutableArray alloc] initWithObjects:@"Product1", @"Product2", nil];

并将它们添加到一个数组中:

NSMutableArray *aisleArray = [[NSMutableArray alloc] initWithObjects:aisleOne, aisleTwo, aisleThree, aisleFour, nil];

然后,在删除单元格时调用此代码。它将从aisleArray中删除所有空的过道(需要全局定义):

NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:aisleArray];
for (int i=0; i<[tempArray count]; i++) {
    if ([[tempArray objectAtIndex:i] count] == 0) {
        [aisleArray removeObjectAtIndex:i];
    }
}
[self.tableView reloadData];

为此,这两种方法应该是:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [aisleArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[aisleArray objectAtIndex:section] count];
}

(未测试的)

答案 2 :(得分:0)

只需获取该部分的表haderview并将其从超级视图中删除,tableView就不会对其进行管理。

UIView *mysteriousView = [tableView headerViewForSection:indexPath.section];
[tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
[mysteriousView removeFromSuperview];

希望这有帮助!

答案 3 :(得分:0)

以后我很少遇到同样的问题...删除上一部分并不会从表格视图中移除最后一部分标题。

但是我注意到剩下的标题框正好在正常的表视图内容之下。 因此,对我有用的解决方法(快速但很容易将其转换为Objective C)是这样的:

DispatchQueue.main.async {
    let unwantedViews = self.tableView.subviews.filter{ $0.frame.minY >= self.tableView.contentSize.height}
    unwantedViews.forEach{ $0.isHidden = true }
}