带有 UINavigationController 作为选项卡的 UITabViewController
Posted
技术标签:
【中文标题】带有 UINavigationController 作为选项卡的 UITabViewController【英文标题】:UITabViewController with a UINavigationController as a tab 【发布时间】:2016-12-02 15:35:35 【问题描述】:我的数据由UITabBarController
的两个选项卡共享。第一个选项卡负责生成和更新第二个选项卡所使用的数据数组。
我原来在选项卡之间共享数据的方法奏效了。
------UIViewController
---UITabBarController
------UIViewController
使用上述方法,我从第一个选项卡中访问了数据数组:
let pointsViewController = self.tabBarController?.viewControllers?.first as! ShowPointsViewController
tableHeaders = pointsViewController.tableHeaders
ShowPointsViewController 是第一个标签
这是我的问题:
当我将我的第一个 UIViewController
嵌入到 UINavigationController
中,然后尝试使用下面的代码访问我的数据数组时,我收到运行时错误,因为 .first...
之后的代码返回为零。我知道我访问不正确,获得相同结果的正确方法是什么?
let pointsViewController = self.tabBarController?.viewControllers?.first?.navigationController?.topViewController as! ShowPointsViewController
【问题讨论】:
【参考方案1】:如果我理解得很好,你创造了这样的东西:
------UINavigationController ------UIViewController
---UITabBarController
------UINavigationController ------UIViewController
self.tabBarController?.viewControllers?.first 已经是 UINavigationController。
使用以下代码:
let pointsViewController = (self.tabBarController?.viewControllers?.first as? UINavigationController)?.topViewController as! ShowPointsViewController
【讨论】:
Gahhhh 完美这工作。我认为 Swift 的类型推断可以让我避免强制转换为UINavigationController
。出于好奇,为什么这不适用于这里?
self.tabBarController?.viewControllers 包含 UIViewControllers 数组。并非所有这些都必须是 UINavigationController (就像在您之前的示例中一样),并且因为您需要获取 UINavigationController 的典型 topViewController 属性,所以您需要强制转换。【参考方案2】:
self.tabBarController?.viewControllers?.first?
是你的navigationController
,所以你在导航控制器上调用.navigationController
,它返回nil
。
要解决此问题,请从您的通话中删除 .navigationController
:
let pointsViewController = self.tabBarController?.viewControllers?.first?.topViewController as! ShowPointsViewController
【讨论】:
以上是关于带有 UINavigationController 作为选项卡的 UITabViewController的主要内容,如果未能解决你的问题,请参考以下文章
在 UINavigationController 中添加带有标题的图像
带有自定义 NavigationBar 的 UINavigationController
带有 uinavigationcontroller 和 uitabbarcontroller 的 iphone 应用程序
UINavigationController 推送带有隐藏导航栏的视图控制器