2013-07-12 150 views
9

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

a)如果它一直滚动到底部,它会自动滚动(大约50点),留下最后一个细胞几乎不可见,所以我不得不再次向下滚动。我的牢房都有60个高度。

b)滚动条总是显示然后消失,表明有东西在移动UITableView(尽管如果没有滚动到底部,内容将不会自动移动)。

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

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

回答

2

我设法解决了第一个问题。似乎这个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; 
    } 
+0

你能否更详细地解释为什么会发生这种情况?或者可以有人。 – Krtko

+0

其惊人的......解决了类似的问题......问题是,无论何时从视图控制器导航回来,tableview的滚动偏移量都会相应地改变。因此,您需要捕获prePareForSegue:方法内的属性(即,在导航之前)中的contentoffset值,然后检查viewWillAppear:method内的同一个类中的值。如果更改,则将scrolloffset属性值设置为零 –

0

只是一个预感,你有一个流氓scrollToRowAtIndexPath:atScrollPosition:animated挂?

+0

不,我在Xcode中搜索了我的整个项目,没有代码行弹出。 – swiftcode

+0

我更新了一些更多相关信息。 – swiftcode

7

将以下内容添加到viewDidLoad中。

self.automaticallyAdjustsScrollViewInsets = NO; 

这解决了导航回浏览器后,我的表视图的问题下移。

3

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

迄今给出的所有答案都不能真正解决问题。问题是,当一个表正在被重绘时,例如当视图被推送时,iOS忘记(或不)考虑先前计算的单元大小。

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

然而,提供的解决方案有矫枉过正,并有一定的情况下,为什么这个缓存会失败(例如一个UIContentSizeCategoryDidChangeNotification并不算是)

但有一个即使它是奇很简单的解决办法:

如果您在didSelectRowAtIndexPath使用手动performSequeWithIdentifier,只是之前添加[self.tableView reloadData]

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

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

0

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

这只是第一次发生。下次它计算正确。我发现的一件事是,当A类(有tableview)从init中推入另一个B类时。当打开B类键盘时,调用A类的viewDidLoad。并且在从导航控制器卸载B类之前。泰伯维重新加载对于A类

0

设置automaticallyAdjustsScrollViewInsets按照以上建议没有工作,也没有缓存,并设置tableViewScrollOffset工作。

因此想出了一个解决方案,它为我工作就像一个魅力。

的解决方法是增加一个虚拟的UIView具有1像素和320像素的宽度的高度,并将其放置“顶部布局指南”和之间的UITableView。这个视图的背景可以设置为清晰的,以使其不可见。

现在使用Autolayouts,将Dummy View的顶部固定到顶部。现在就Dummy View设置tableview的顶部约束。发现这解决了tableview错位的问题。与自动版式约束沿着虚拟视图的

截图已经提供了参考。虚拟视图已被设置为更大的高度和红色背景色,仅供参考。

enter image description here

相关问题