UIViewController作为另一个UIViewController的子类

时间:2019-06-17 09:40:09

标签: swift

enter image description here我的标签栏中有五个标签栏项目。第五项是弹出ViewController。因此,当我单击该按钮时,将在当前控制器中显示一个弹出窗口。我使用UIViewController作为实现此目的的子类。

我的问题是,如果我在FirstTabItem中添加一个弹出ViewController并移至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 :(得分:0)

您有验证码

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

如果那是您要关闭的那个,则必须从显示的同一视图控制器中关闭

UIApplication.topViewController()?.dismiss...

通常,您不希望在此函数中执行所有这些代码-它应该只是返回一个Bool,而不更改视图层次结构。