【发布时间】:2014-03-20 14:13:02
【问题描述】:
我被困住了。我有一个稍微复杂的视图层次结构。一个 UITabBarController 来统治三个 UINavigationControllers。在每个 NavigationController 中,我都有一个根 UITableViewController 来生成其他同类。都是子类。昨天一切正常,在调整了一些滚动视图插图并切换到块后,我遇到了问题。
当我将另一个 TableViewController 推送到导航堆栈时,一切正常。但是,当我弹出那个 TableViewController 并记录根 TableViewController 的 contentSize
viewWillAppear contentSize: {320, 15063.414}
viewWillLayoutSubviews contentSize: {0, 0}
viewDidLayoutSubviews contentSize: {0, 0}
viewDidAppear contentSize: {0, 0}
这只发生在从我的自定义 TableViewController 弹出到另一个同类型的 TableViewController 时。知道发生了什么(大概在viewDidLayoutSubviews)?
我怀疑 TabBarController 或 NavigationController 可能出了点问题,但我仍在画一个空白。
我已将记录的内容更新为包括 viewWillLayoutSubviews 和 viewDidLayoutSubviews。似乎在 AutoLayout 得到它之前,一切都归零了。这个假设正确吗?
编辑
当我将视图控制器推到顶部时,也会发生正确设置内容大小然后将其设置为零的相同模式。然后当我弹出它时,它会设置正确的 contentSize 然后将其删除。
我想出了一个解决方法。我缓存了我的单元格高度,所以在viewWillLayoutSubviews 中我正确设置了 contentSize。如果我以模态方式呈现视图,问题仍然存在,因为没有调用 viewWillLayoutSubviews。还是有些奇怪。
【问题讨论】:
-
每当我看到我无法解释的奇怪布局行为时,我都会寻找从主线程以外的线程访问 UI 组件的代码。你说你“切换到块”;也许你在这些块中有 UI 操作代码?
-
我试图非常小心地让完成块在主线程上执行。不过我会再检查一次。从任何 viewDidSomething 中调用带有完成块的方法是不是很糟糕?
-
这还不错,但为了安全起见,我总是在块内和接收器内使用
dispatch_async(dispatch_get_main_queue(), ^{});样板,我不确定是什么线程在调用它们(例如NSNotificationCenter选择器)。 -
我已经完成了我拥有的所有方法,它们都在主线程上执行。我还删除了所有涉及 scrollViewInsets 和任何自定义弹出动画的代码。还是什么都没有……
-
虽然设置不同,但我想我有同样的问题:stackoverflow.com/questions/27090751/…。您是否找到了正确解决此问题的方法,或者至少了解了它的原因?我发现对我有用的是将表格的 contentSize 设置在
viewWillLayoutSubviews内,但感觉不对...
标签: ios uitableview contentsize popviewcontrolleranimated