如何获取超过 5 个项目的 UITabBarController 中选定的 UITabBarItem 的标签?

How to get the tag of selected UITabBarItem in UITabBarController for more than 5 items?

在情节提要中,我创建了 UITabBarController 与另一个视图控制器的 6 个关系。所以现在我有 6 UITabBarItems。我将它们标记为 05。这就是为什么我检测到用户选择了 UITabBarItem 的原因。

注意:

我不能使用 selectedIndex 因为这种方式不会告诉我选择了哪个选项卡,因为用户可以更改 UITabBar[=49 中项目的顺序=].

UITabBar 中有 属性 itemsselectedItem 但如果超过 5 个项目,属性 items 保留最多 5 项。

例如,当用户在索引 45 处选择 UITabBarItem 时,他们选择的索引都是 4。现在带有索引 4UITabBarItem 在标签栏上表示 "More Items".

所以,我确实需要访问选定的 UITabBarItem 以获取其 标签。有什么办法可以做到这一点吗?

这是我的情况。

你可以试试这样的

tabBarController.selectedViewController.view.tag

因为 UIViewController 没有标签,但是它的视图有。

此外,您可以使用 UIViewController 的 属性 restorationIdentifier

经过大量挖掘,解决方案相当简单:-)

在您的 UITabBarController 中符合 UINavigationControllerDelegate 协议的 delegate

//MARK: - UITabBarControllerDelegate

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {

    if viewController == tabBarController.moreNavigationController {
        tabBarController.moreNavigationController.delegate = self
    } else {
        findSelectedTagForTabBarController(tabBarController)
    }
}

//MARK: - UINavigationControllerDelegate

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
    findSelectedTagForTabBarController(navigationController.tabBarController)
}

//MARK: - Private

private func findSelectedTagForTabBarController(tabBarController: UITabBarController?) {

    if let tabBarController = tabBarController {
        if let viewControllers = tabBarController.viewControllers {
            let selectedIndex = tabBarController.selectedIndex
            let selectedController: UIViewController? = viewControllers.count > selectedIndex ? viewControllers[selectedIndex] : nil
            if let tag = selectedController?.tabBarItem.tag {
                //here you can use your tag
            }
        }
    }
}