弹出视图控制器后UITableViewController奇怪的行为

时间:2013-07-12 14:46:12

标签: ios objective-c uitableview scroll

我的UITableView有一堆可重复使用的单元格,当我点击其中一个时,它会带我到另一个视图控制器(通过push segue)显示该单元格的细节(让我们说它是一个项目,所以它会显示一个项目的详细信息 - 名称,价格,图像等...)。当我弹出该视图控制器时(通过点击后退按钮),UITableView有一个奇怪的行为:

a)如果它一直滚动到底部,它将自动滚动(大约50点),使最后一个单元格几乎不可见,所以我必须再次向下滚动。我的牢房全高60分。

b)滚动条始终显示然后消失,表示某些内容正在移动UITableView(尽管如果没有滚动到底部,内容将不会自动移动)。

这种情况发生在我的应用中的多个UITableView中。我没有强制在viewWillAppear中重新加载表视图,所以我不明白发生了什么。从服务器加载后,我的内容是静态的(除非用户更改它,然后执行重新加载)。但只是显示项目的详细信息并弹出该VC不会改变表视图​​中的任何内容。

编辑:好的,我已经弄清楚问题是什么:我在推动那个segue时隐藏了UIToolbar。如果我保持它总是可见的(我不想要),它仍然显示在我的表视图中弹出时动画滚动条,但如果在最后几行中不滚动表视图。

6 个答案:

答案 0 :(得分:7)

将以下内容添加到viewDidLoad。

self.automaticallyAdjustsScrollViewInsets = NO;

这解决了导航回视图控制器后表格视图向下移动的问题。

答案 1 :(得分:3)

我设法解决了第一个问题。似乎tableview没有考虑UIToolbar的44点。

将tableview偏移量保存在prepareForSegue:中(将其保存在CGPoint属性中)

self.tableViewScrollOffset = self.tableView.contentOffset;

然后,在viewWillAppear:中,检查它是否已被修改。如果是,请恢复它。

if(self.tableView.contentOffset.y != self.tableViewScrollOffset.y) {
        [self.tableView setContentOffset:self.tableViewScrollOffset];
        self.tableViewScrollOffset = CGPointZero;
    }

答案 2 :(得分:3)

这种行为确实是iOS 8.x中的一个错误。

到目前为止给出的所有答案都无法真正解决问题。问题是,当正在重新绘制表格时,iOS会忘记(或不会)考虑先前计算的单元格大小,例如在推送视图时。

可以在此处找到解决此问题的一种方法:UITableView layout messing up on push segue and return. (iOS 8, Xcode beta 5, Swift)(因此这个问题甚至与此问题重复)。

但是,提供的解决方案存在过度杀伤,并且在某些情况下,此缓存将失败(例如,不考虑UIContentSizeCategoryDidChangeNotification)

但是有一个非常简单的解决方案,即使它很奇怪:

如果您在performSequeWithIdentifier中使用手册didSelectRowAtIndexPath,只需在此之前添加[self.tableView reloadData]

如果您正在使用单元格中的IB seque,只需在[self.tableView reloadData]代码中添加prepareForSeque即可。

为什么这解决了这个问题的原因是,这将迫使iOS重新估计可见单元格,因此它不再将内容滚动到另一个位置。幸运的是,tableView reloadData不会花费太多开销,因为只会重新估计可见单元格。

答案 3 :(得分:0)

只是预感,你有一个流氓scrollToRowAtIndexPath:atScrollPosition:animated在附近吗?

答案 4 :(得分:0)

我也面临这个问题。我设法找到了它。在我的情况下,原因是tableview标题高度是基于计算的文本和文本高度是负的,因为即使contentinset和scrollinset为零,tableview正在向下移动。

这只是第一次发生。下次计算正确。我发现一个令人厌倦的事情是当A类(有tableview)从init推送另一个B类时。当打开B类键盘时,调用A类的viewDidLoad。在从导航控制器卸载B类之前。 Tableview重新加载为A类。

答案 5 :(得分:0)

如上所述设置automaticAdjustsScrollViewInsets既不能缓存也不能设置tableViewScrollOffset。

因此提出了一种对我有用的解决方法。

解决方法是添加一个高度为1px且宽度为320px的虚拟UIView,并将其放在“顶部布局指南”和UITableView之间。可以将此视图的背景设置为清除,以使其不可见。

现在使用Autolayouts,将Dummy View的顶部修复为顶部。现在设置tableview的关于Dummy View的顶部约束。发现这解决了tableview错位的问题。

虚拟视图的屏幕截图以及自动布局约束已经提供,以便于参考。虚拟视图已设置为更大的高度和红色背景颜色仅用于说明目的。

enter image description here