11

我想显示一个包含多个部分的表格,最初只显示 3 个部分元素。当用户点击部分页脚时,部分页脚会丢失(变为 nil)并且该部分的所有元素都将显示给用户。

出于这个原因,当用户点击节页脚时,我调用以下代码:

-(void)loadMoreRowsInSection:(NSInteger)section {
    [groupStates replaceObjectAtIndex:section withObject:[NSNumber numberWithBool:YES]];
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:NO];
}

我有以下代码来显示节页脚或不显示:

-(UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    int count = [[(NSDictionary*)[filters objectAtIndex:section] valueForKeyPath:@"values.value"] count];
    if (count>3&&![[groupStates objectAtIndex:section] boolValue]) {
        LoadMoreFooter* loadMoreFooter = [[LoadMoreFooter alloc] initWithParent:self Section:section];
        return [loadMoreFooter view];
    }   
    else return nil;
}

当用户点击部分页脚并调用 loadMoreRowsInSection 函数时,此部分会重新加载,但该部分的当前行会消失。当我向上向下滚动时,使行离开屏幕并再次进入,行再次出现。

如果我调用reloadData而不是reloadSections:withRowAnimation:,则没有问题,但重新加载所有表似乎不是一个好主意。另外,reloadTable 中没有动画。

有没有人遇到过这个问题?

4

5 回答 5

27

从您自己保留对它的引用的意义上说,这是一个“静态”单元格吗?在这种情况下,问题可能是这样的:

当您进行动画重新加载时,表格视图将淡出现有单元格,同时淡入新单元格。问题是,当“新”单元格与旧单元格完全相同时,同一个单元格将同时淡入和淡出!在您的情况下,淡出动画优先并且单元格被隐藏。

以下是一些可能的解决方案:

  1. 代替静态单元,有一个可重用的“包装单元”子类——一个唯一目的是包含一个包装视图的单元。然后,改为保留对视图的静态引用,并将它们添加到cellForRowAtIndexPath:

  2. 避免重新加载静态单元格的索引路径 - 而是这样做[UIView transitionWithView:self.myStaticCell duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:nil]

于 2013-12-10T10:12:40.557 回答
6

reloadData在调用出现后添加调用reloadSections:withRowAnimation:以修复消失的单元格问题而不影响动画。

于 2013-09-04T23:15:59.467 回答
6

我也有这个问题。我UITableViewRowAnimationNone改用它,由于某种原因仍然会为该部分设置动画(这reloadData不会),但它也会在动画之后正确显示它。

于 2011-08-22T10:15:15.820 回答
1

我有一个类似的问题,即节标题无论在哪里都会被卡住。尽管即使滚动开/关屏幕我的问题仍然存在:

iphone应用截图

我发现修复它的唯一方法就是使用reloadData而不是reloadSections:withRowAnimation:.

于 2011-02-24T22:48:48.427 回答
0

我的错误是:我有一个包含多个部分的 TableView。当我选择一个部分进行展开(并显示单元格)时,上面的其他部分被隐藏了。

我将标题视为单元格。

我的解决方案没有reloadData()

在 override funcviewDidLoad()方法中,我正在使用此代码:

tableTeams.registerNib(UINib(nibName: "header", bundle: nil ), 
forCellReuseIdentifier: "HeaderCell")

但我应该使用这个:

tableTeams.registerNib(UINib(nibName: "header", bundle: nil),
forHeaderFooterViewReuseIdentifier: "HeaderCell")

在里面func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?,我会使用这个代码:

func tableView(tableView: UITableView, viewForHeaderInSection section:
Int) -> UIView? {
      let cell = tableView.dequeueReusableHeaderFooterViewWithIdentifier("HeaderCell")
as! CustomHeaderUiView

我希望这有帮助!

于 2016-06-15T19:20:31.490 回答