UIViewController как подкласс другого UIViewController - PullRequest
0 голосов
/ 17 июня 2019

enter image description here У меня есть пять элементов на панели вкладок. Пятый элемент - это всплывающее окно ViewController. Поэтому, когда я нажимаю эту кнопку, в текущем контроллере отображается всплывающее окно. Я использую UIViewController в качестве подкласса для достижения этой цели.

Моя проблема в том, что я добавляю всплывающий ViewController в FirstTabItem и перемещаюсь во SecondTabItem. Затем, если я снова нажму FirstTabItem, отобразится только всплывающее окно ViewController, а текущий ViewController будет скрыт. Вот мой код.

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

    if let navigationController = viewController as? UINavigationController,
        navigationController.viewControllers.contains(where: { $0 is MoreViewController }) {

        let vc = MoreView(nibName: "MoreView", bundle: nil)
        vc.modalPresentationStyle = .overCurrentContext
        UIApplication.topViewController()?.present(vc, animated: true, completion: nil)

        return false
    } else  {
        return true
    }
}

    extension UIApplication {

    class func topViewController(_ viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
    if let nav = viewController as? UINavigationController {
        return topViewController(nav.visibleViewController)
    }
    if let tab = viewController as? UITabBarController {
        if let selected = tab.selectedViewController {
            return topViewController(selected)
        }
    }
    if let presented = viewController?.presentedViewController {
        return topViewController(presented)
    }

    return viewController
}

}

1 Ответ

0 голосов
/ 17 июня 2019

У вас есть код

UIApplication.topViewController()?.present ....

Если это тот, который вы хотите отклонить, вы должны отказаться от того же контроллера представления, который представил

UIApplication.topViewController()?.dismiss...

Как правило, вы не захотите делать весь этот код в этой функции - он должен просто возвращать Bool, а не изменять иерархию представления.

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