Как добраться до самого глубокого ViewController в сложной иерархии - PullRequest
0 голосов
/ 05 августа 2020

У меня есть Иерархия, которая выглядит следующим образом:

V C Иерархия

  1. UITabBarController

1.1 ViewController с 2 containerViews

1.1.1. UINavigationController

1.1.1.1. UITableViewController

1.1.1.1.1 UITableViewController

1.2 ViewController с 2 контейнерами View

1.2.1. UINavigationController

1.2.1.1. UITableViewController

1.2.1.1.1 UITableViewController

Требуемое решение

Я хочу иметь самый глубокий V C PopTo Root при выборе tabBar. В этом посте объясняется, как

мне удалось найти правильный V C в отладчике, но при написании кода для его получения Xcode жалуется на Segmentation Fault 11

Code

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController ) -> Bool {

if tabBarController.selectedViewController === viewController {

if let nc = viewController.children.first(where: { $0.isKind(of: UINavigationController.self)}) as? UINavigationController {

if let handler = nc.children.first(where: { $0.isKind(of: TabBarReselectHandling.self )}) as? TabBarReselectHandling {
handler.handleReselect()
            }
        return true
    }

Как только я закомментирую строку if let handler, Xcode показывает ошибку: An internal error occured. Source editor functionality is limited. Attempting to restore...

Эта строка работает для одного tabBarItem, но не для всех, поскольку два containerView в V C 1.1 и 1.2 могут быть в разном порядке

let handler = viewController.children[1].children[1] as? TabBarReselectHandling

Любые предложения о том, как я могу безопасно добраться до моего самого глубокого V C?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Попробуйте это Swift 4 версия

        if (navigationController?.viewControllers.filter { $0 is YourFirstViewController }.first != nil)

        {
            let dashboardVC = navigationController!.viewControllers.filter { $0 is YourFirstViewController }.first
            navigationController!.popToViewController(dashboardVC!, animated: true)
        }
            
        else if (navigationController?.viewControllers.filter { $0 is YourSecondViewController }.first != nil)
        {
            let dashboardVC = navigationController!.viewControllers.filter { $0 is YourSecondViewController }.first
            navigationController!.popToViewController(dashboardVC!, animated: true)
        }
0 голосов
/ 05 августа 2020

Вы можете проверить наличие selectedIndex и преобразовать viewController как UINavigationController, а затем выполнить popToRootViewController(animated:) для достижения этого результата.

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if selectedIndex == 0, let navVC = viewController as? UINavigationController { // replace 0 with your value
        navVC.popToRootViewController(animated: true)
    }
}

Примечание. Чтобы это сработало, ваша реализация метода func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController ) -> Bool должна быть удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...