为啥选项卡视图中的一个表视图可以正常工作,而另一个在导航栏下启动?

Posted

技术标签:

【中文标题】为啥选项卡视图中的一个表视图可以正常工作,而另一个在导航栏下启动?【英文标题】:Why would One table view in a tab view work fine while the other starts under the nav bar?为什么选项卡视图中的一个表视图可以正常工作,而另一个在导航栏下启动? 【发布时间】:2013-10-17 18:55:39 【问题描述】:

我正在开发一个使用主从模板的修改版本的应用程序。该应用程序是基于文档的,因此它使用列出所有文档的表格视图进行统计。一旦选择了一个文档,就会在具有三个选项卡的选项卡栏中幻灯片,其中前两个是表格视图。两个表视图都有自己的表视图控制器类,它们共享一个通用的自定义超类。继承是UITableViewController -> TMSTableViewController -> TMSExpensesTableViewController/TMSCategoriesTableViewController。无论哪个选项卡首先显示,都应该与从导航栏下方开始的表格一样显示。但是,要加载的第二个选项卡始终从导航栏下方的屏幕顶部开始,因此第一行半被隐藏。如果它只是其中一个表视图,我会假设控制器或视图有问题,但我实际上复制了第一个选项卡的场景,即使它们都有相同的控制器运行它们,第二个仍然从顶部开始屏幕。

我是否在 ios7 中发现了错误,或者在标签栏中使用多个表格视图时需要执行一些奇怪的技巧?

每个表都显示一个单一的核心数据实体类型,TMSTableViewController 具有处理获取结果控制器的所有通用代码以及大多数表视图代码。这两个子类中的唯一方法是根据显示的实体类型适当地配置单元格,将获取的结果控制器设置为具有适当的实体,并在需要时添加适当的实体类型。

【问题讨论】:

【参考方案1】:

这似乎是 iOS 7 中的一个错误的结果。解决方法是在除第一个表格视图之外的所有内容中使用以下代码:

CGRect barFrame = self.navigationController.navigationBar.frame;
    CGRect tabFrame = self.tabBarController.tabBar.frame;
    self.tableView.contentInset = UIEdgeInsetsMake((barFrame.origin.y + barFrame.size.height), 0, tabFrame.size.height, 0);

我使用包裹在#ifdef 中的这段代码,这样当它得到修复时,我可以轻松删除关联的#define 并让所有代码消失。

【讨论】:

以上是关于为啥选项卡视图中的一个表视图可以正常工作,而另一个在导航栏下启动?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要更改选项卡,停止 ios 应用程序中的动画?

SwiftUI 选项卡视图显示表

SDK 4.2 中的导航栏问题

PanResponder 中的 ScrollView

带有视图参数的 Ajax Quicktab 不起作用

如何知道何时从子视图中单击了超级视图中的选项卡项