如何在 UITabBarController 中获取特定 UIViewController 的索引
Posted
技术标签:
【中文标题】如何在 UITabBarController 中获取特定 UIViewController 的索引【英文标题】:How to Get Index of Specific UIViewController in UITabBarController 【发布时间】:2019-04-12 22:02:50 【问题描述】:因此,以编程方式从 UITabBarController
中的一个选项卡切换到另一个选项卡很容易...
self.tabBarController?.selectedIndex = 1
...但是每次对标签索引进行硬编码似乎很不优雅。例如,如果重新排序选项卡,则会导致问题。
有没有办法检索特定 UIViewController
的 [first] 索引,以便代码更像以下内容?
if let destinationIndex = self.tabBarController?.index(of: ExampleViewController)
self.tabBarController?.selectedIndex = destinationIndex
【问题讨论】:
在什么情况下标签索引会被重新排序? 例如开发者的设计变更。 【参考方案1】:您需要使用firstIndex(where:)
方法。
if let destinationIndex = self.tabBarController?.viewControllers.firstIndex(where: $0 is ExampleViewController )
self.tabBarController?.selectedIndex = destinationIndex
【讨论】:
完美,谢谢!我没有想过要对 viewControllers 属性进行操作,而不是对 tabBarController 本身进行操作。这就解释了为什么我找不到它。 如果 VC 嵌入在 UINavigationController 中,知道如何使其工作吗?我知道它会使用 .viewControllers.first 是 SuggestionsViewController,但不确定如何将 $0 参数转换为 UINavigationController 以便进行检查。 我解决了:if let destinationIndex = self.tabBarController?.viewControllers?.firstIndex(where: let navController = $0 as? UINavigationController return navController?.viewControllers.first is ExampleViewController ) self.tabBarController?.selectedIndex = destinationIndex
【参考方案2】:
对于那些应用它的人,这是来自@Craig Siemens 的答案,适用于目标 VC 嵌入导航控制器时:
if let destinationIndex = self.tabBarController?.viewControllers?.firstIndex(where:
let navController = $0 as? UINavigationController
return navController?.viewControllers.first is ExampleViewController
)
self.tabBarController?.selectedIndex = destinationIndex
【讨论】:
以上是关于如何在 UITabBarController 中获取特定 UIViewController 的索引的主要内容,如果未能解决你的问题,请参考以下文章
如何从 View 获取数据到 UITabBarController
如何在特定索引处显示 UITabBarController?
如何防止 UITabBarController 更新子视图?
如何在 uitabbarcontroller 中的 uibutton 单击事件上推送其他视图控制器?