Представить модально UIViewController из UITabBarController программно - PullRequest
0 голосов
/ 22 апреля 2020

Привет всем, мне нужно представить View Controller модально, когда пользователь выбирает индекс 1 моей панели вкладок.

Я создал класс UITabBarController, где я создаю экземпляры всех контроллеров представления, которые будут показаны с tabBar

В этой части кода я управляю модальным представлением контроллера представления для индекса 1 tabBar

Проблема заключается в том, что при выборе индекса 1 VCIndex1 контроллер вызывается дважды ... один раз для обычного отображения tabBar и другой раз для модального представления

Как я могу представить VCIndex1 модально без панели вкладок, вызывающей контроллер х2 раза?

class TabBarController: UITabBarController {


 override func viewDidLoad() {
    super.viewDidLoad()

    delegate = self

    tabBar.barTintColor = UIService.Color.backgroundColor
    tabBar.isTranslucent = false

    tabBar.tintColor = UIService.Color.primaryColor
    tabBar.selectedItem?.badgeColor = UIService.Color.secondaryColor
    tabBar.unselectedItemTintColor = UIService.Color.tertiaryColor
    tabBar.shadowImage = UIImage()

    let vcIndex0 = UINavigationController(rootViewController: VC0())
    vcIndex0 = UIImage(systemName: "rosette")

    let vcIndex1 = UINavigationController(rootViewController: VC1())
    vcIndex1 = UIImage(systemName: "plus.square.on.square")

    let vcIndex2 = UINavigationController(rootViewController: VC2())
     vcIndex2 = UIImage(systemName: "tag")

    viewControllers = [vcIndex0, vcIndex1, vcIndex2]


}

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let indexOfTab = tabBar.items?.firstIndex(of: item)

        if indexOfTab == 1 {

            let vc = VC1()
            vc = .fullScreen
            present(vc, animated: true, completion: nil)

        }

    }

}

1 Ответ

1 голос
/ 22 апреля 2020

Возможно, вы захотите внедрить shouldSelect ( Apple Docs ) и обрабатывать там ваши вкладки обнаружения и модального представления.

Дайте это попробовать:

class TabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        delegate = self

        tabBar.barTintColor = .lightGray // UIService.Color.backgroundColor
        tabBar.isTranslucent = false

        tabBar.tintColor = .green // UIService.Color.primaryColor
        tabBar.selectedItem?.badgeColor = .blue // UIService.Color.secondaryColor
        tabBar.unselectedItemTintColor = .cyan // UIService.Color.tertiaryColor
        tabBar.shadowImage = UIImage()

        let vcIndex0 = UINavigationController(rootViewController: VC0())
        vcIndex0.tabBarItem = UITabBarItem(title: "0", image: UIImage(systemName: "rosette"), tag: 0)

        // just create a plain UIViewController here (it will never be seen)
        //let vcIndex1 = UINavigationController(rootViewController: VC1())
        let vcIndex1 = UIViewController()
        vcIndex1.tabBarItem = UITabBarItem(title: "1", image: UIImage(systemName: "plus.square.on.square"), tag: 0)

        let vcIndex2 = UINavigationController(rootViewController: VC2())
        vcIndex2.tabBarItem = UITabBarItem(title: "2", image: UIImage(systemName: "tag"), tag: 0)

        viewControllers = [vcIndex0, vcIndex1, vcIndex2]

    }

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

        if viewController == tabBarController.viewControllers?[1] {
            let vc1 = VC1()
            vc1.modalPresentationStyle = .fullScreen
            present(vc1, animated: true, completion: nil)
            return false
        }

        return true

    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        // if you want to do something based on selected tab
        if let indexOfTab = tabBar.items?.firstIndex(of: item) {
            print("didSelect:", indexOfTab)
        }
    }

}

class VC0: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
    }
}

class VC1: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .green
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissMe))
        view.addGestureRecognizer(tap)
    }
    @objc func dismissMe() -> Void {
        dismiss(animated: true, completion: nil)
    }
}

class VC2: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .blue
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...