UITableView 在 iOS 7.1 上无法正确重新加载

Posted

技术标签:

【中文标题】UITableView 在 iOS 7.1 上无法正确重新加载【英文标题】:UITableView doesn't reload properly on iOS 7.1 【发布时间】:2014-12-09 13:10:05 【问题描述】:

我有一个UIViewController,其中有一个UITableView 和一个UISegmentedControl,其中有4 个段。每次用户点击不同的段时,表格视图中显示的单元格类型都应该改变。为此,我有以下代码:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender 
    [self.tableView reloadData];

通常,第三个部分会使用最多的单元格填充表格视图。因此,在第三段中,当我滚动到表格底部然后切换到另一个段时,我希望表格视图重新加载其单元格并保持在相同的滚动位置。但是,发生的情况是标题视图似乎位于屏幕底部,就好像表格视图滚动到顶部到其极限一样。然后,当我再次触摸并开始滚动时,一切恢复正常,就像表格刚刚向下滚动并出现单元格一样。

我已经尝试解决这个问题一段时间了,到目前为止我看到的帖子都提出了同样的问题。他们说如果动画在主线程以外的线程中处理,这类问题是不可避免的。所以我尝试修改如下代码:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender 
    dispatch_async(dispatch_get_main_queue(), ^
        [self.tableView reloadData];
    );

和:

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^
        [self.tableView reloadData];
    ];

他们都没有工作。我还尝试在重新加载 bu 后以编程方式滚动表格视图,但这似乎也不起作用。

任何人有任何其他想法为什么会发生这种情况?我应该注意到这个问题只发生在 ios 7.1 上。

【问题讨论】:

您是否尝试仅重新加载一个单元格,而不是使用 reloadRowsAtIndexPaths:withRowAnimation: 重新加载整个表格? 【参考方案1】:

据我了解,只有在从结果数最多的分段控制索引过滤器过渡时,您才会遇到问题。

当您尝试在重新加载后以编程方式滚动表格视图时,您是否计算了分段控件 1 或 2 的目标结果集的索引路径?

示例:

如果我们从 segmentedControlIndex 3 移动到 1,其中 3 有 30 条记录,1 有 10 条记录:

[self.tableView reloadData]
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:10 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath
                atScrollPosition: UITableViewScrollPositionBottom
                        animated:YES];

以上假设您有 1 个部分。

【讨论】:

以上是关于UITableView 在 iOS 7.1 上无法正确重新加载的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7.1 中未显示 UITableView 选定的单元格分隔符

UISearchBar 在 iOS 7.1 上添加到 UITableViewCell 时会更改其超级视图

Jenkins 生成的 ipa 无法在 iPhone 上安装(iOS 9 + XCode 7.1)

升级到 iOS 9 和 MobileFirst 7.1 后无法登录设备或模拟器上的应用程序

UITableView 滑动删除在 iOS8 上无法正常工作

iOS 7.1 - 7.1.2 用户无法打开我的游戏