Представить модальный ViewController через TabBarController - PullRequest
0 голосов
/ 23 января 2020

У меня есть основной tabBarController, и я хотел бы представить viewController modally, когда нажата определенная tabBarItem.

Я загружаю viewControllers в мой tabBarController как ...

func setupViewControllers() {
    self.tabBar.isHidden = false

    if let firstVC = storyboard?.instantiateViewController(withIdentifier: "first") as? FirstViewController, let secondVC = storyboard?.instantiateViewController(withIdentifier: "second") as? SecondViewController, let thirdVC = storyboard?.instantiateViewController(withIdentifier: "third") as? ThirdViewController, let fourthVC = storyboard?.instantiateViewController(withIdentifier: "fourth") as? FourthViewController, let fifthVC = storyboard?.instantiateViewController(withIdentifier: "fifth") as? FifthViewController {

        let firstNavController = UINavigationController(rootViewController: firstVC)
        let secondNavController = UINavigationController(rootViewController: secondVC)
        let fourthNavController = UINavigationController(rootViewController: fourthVC)
        let fifthNavController = UINavigationController(rootViewController: fifthVC)

        firstNavController.tabBarItem.image = image
        secondNavController.tabBarItem.image = image
        fourthNavController.tabBarItem.image = image
        fifthNavController.tabBarItem.image = image     
        thirdVC.tabBarItem.image = image

        tabBar.tintColor = nil

        //Load tabBar viewControllers
        viewControllers = [homeNavController, postNavController, plusMenuVC, meetupNavController, profileNavController]
    }
}

Затем я согласовал tabBarViewController с UITabBarControllerDelegate, чтобы вызвать метод ...

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if tabBarController.selectedIndex == 2, let thirdVC = viewController as? ThirdViewController {
        thirdVC.modalPresentationStyle = .overFullScreen
        thirdVC.modalTransitionStyle = .crossDissolve
        present(thirdVC, animated: true, completion: nil)
        return false
    } else { return true }
}

Однако вышеприведенное никогда не срабатывает. Я попытался установить в viewDidLoad

self.delegate = self

Я попытался настроить root навигационные контроллеры и его предка tabBarController делегировать себя.

Казалось, что ничего не работает, и я надеюсь, что кто-то может помогите мне, так как я не смог отладить и найти существующее решение ...

ОБНОВЛЕНИЕ Итак, я создал dummyThirdVC вместо thirdVC в функции setupViewControllers() , В dummyThirdVC я соответствовал UITabBarControllerDelegate, а в viewDidLoad я установил self.tabBarController.delegate = self. Затем я взял метод delegate и ввел его в этот dummyThirdVC, где внутри этого метода delegate я создал реальный thirdVC для представления.

Метод delegate наконец-то срабатывает должным образом, но моя проблема в том, что dummyThirdVC и его представление должны сначала загрузиться и появиться, чтобы delegate был установлен и сработал после этого.

Как я могу не показать dummyThirdVC и сразу же просто представить экземпляр, настоящий thirdVC? Я пытался dummyThirdVC.viewDidLoad() в моей setupViewControllers функции безрезультатно ...

1 Ответ

0 голосов
/ 23 января 2020

Я считаю, что ваш чек неверен. Вы проверяете, что selectedIndex равно 2, но значение selectedIndex всегда будет текущим выбранным индексом панели вкладок, а не индексом, который будет выбран, поэтому вы в основном никогда не достигнете selectedIndex как 2.

Вы также не можете представить контроллер представления, который уже активен, и thirdVC уже активен в вашем tabBar, таким образом, вы получите ошибку. Обходным путем для этого является использование viewController в качестве заполнителя для изображения и заголовка на панели вкладок и создание другого экземпляра для представления.

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if viewController is ThirdViewController {
        let vcToPresent = storyboard?.instantiateViewController(withIdentifier: "third") as? ThirdViewController
        vcToPresent.modalPresentationStyle = .overFullScreen
        vcToPresent.modalTransitionStyle = .crossDissolve
        present(vcToPresent, animated: true, completion: nil)
        return false
    }
    return true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...