从选项卡栏控制器以模态方式呈现视图控制器

Present a View Controller modally from a tab bar controller

我想用相机建一个视图。就像 Instagram 一样,中间有一个按钮,用户可以单击该按钮并显示相机视图。 我在 AppDelegate 中实现了 TabViewController 的代码,但没有任何反应,没有动画或新 ViewController.

的演示

这是我的 AppDelegate:

import UIKit


class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate {
    var window: UIWindow?
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: ViewController) -> Bool {
    if viewController is ViewController {
        let storyboard = UIStoryboard(name: "Main.storyboard", bundle: nil)
        if let controller = storyboard.instantiateViewController(withIdentifier: "cameraVC") as? ViewController {
            controller.modalPresentationStyle = .fullScreen
            tabBarController.present(controller, animated: true, completion: nil)
        }
        return false
    }
    return true
}

这是我的故事板:

有什么想法吗?

我刚刚尝试过,它对我来说非常有效:

为您的 TabBarController 创建自定义 class 并将其分配给故事板中的控制器。

之后覆盖 tabBarController 的 didSelect 并在那里编写您的演示代码:

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

      if let controller = self.viewControllers?[self.selectedIndex] as? ViewController {

          controller.modalPresentationStyle = .fullScreen
          self.present(controller, animated: true, completion: nil
       }
}

希望对您有所帮助!!

我建议为您的 TabBarController 创建自定义 class,然后将委托分配给它。

您可以分配和检查视图控制器的 restorationIdentifier,或者进行类型检查。我通常使用故事板标识符作为视图控制器的恢复标识符。

class TabBarController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.delegate = self
    }

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        if let identifier = viewController.restorationIdentifier, identifier == "cameraVC" {
            let vc = self.storyboard?.instantiateViewController(withIdentifier: "cameraVC") as! CameraViewController
            present(vc, animated: true, completion: nil)
            return false
        }

        return true
    }
}

这是一个您可以试玩的示例: https://gist.github.com/emrekyv/3343aa40c24d7e54244dc09ba0cd95df