UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController

Posted

技术标签:

【中文标题】UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController【英文标题】:UINavigationController in UITabBarController not completely wraps UIViewController 【发布时间】:2019-04-29 13:28:50 【问题描述】:

我有一个UITabBarController 作为我的rootViewcontroller,每个标签有3 个UINavigationController。每个UINavigationController 都有一个初始UIViewController,它只有红色背景色。 我的问题是UINavigationController 在第一次开始时并没有完全覆盖UIViewController。切换选项卡后,它覆盖了UIViewController。那么我在这里做错了什么?

提前致谢。

AppDelegate:

window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = TabBarViewController()
window?.makeKeyAndVisible()

UITabBarController:

class TabBarViewController: UITabBarController 

    override func viewDidLoad() 
        super.viewDidLoad()

        // Navigation Tab
        let navVC = NavigationViewController()

        // Departure Tab
        let depVC = DeparturesViewController()

        // Settings Tab
        let setVC = SettingsViewController()

        self.viewControllers = [
            createNavigationController(title: "Navigation", rootViewController: navVC, imageName: "map"),
            createNavigationController(title: "Abfahrten", rootViewController: depVC, imageName: "station"),
            createNavigationController(title: "Einstellungen", rootViewController: setVC, imageName: "user"),
        ]        
    

    private func createNavigationController(title: String, rootViewController: UIViewController, imageName: String) -> UINavigationController 

        rootViewController.title = title
        let nc = UINavigationController(rootViewController: rootViewController)
        nc.title = title
        nc.view.backgroundColor = .white
        nc.navigationBar.prefersLargeTitles = true
        nc.navigationController?.navigationItem.largeTitleDisplayMode = .always
        nc.tabBarItem.image = UIImage(named: imageName)?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        return nc
    

    override func viewWillAppear(_ animated: Bool) 
        self.selectedIndex = 0
    


非常简单的 UIViewController:

class NavigationViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.backgroundColor = .red
    


【问题讨论】:

能否请您尝试将 nc.view.background 更改为 rootViewController.view.backgroundcolor 出现同样的效果。此外,如果我根本没有设置背景颜色,则相同的效果会出现黑色 【参考方案1】:

从 TabBarController 中删除以下代码后,它完全包装了 Viewcontroller

override func viewWillAppear(_ animated: Bool) 
    self.selectedIndex = 0

但我无法解释原因

【讨论】:

以上是关于UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

为啥标签栏没有出现在整个应用程序中?

UITabBarController 问题中的 UINavigationController

从堆栈中弹出导航控制器/创建双视图

UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController

嵌入在 NavigationController 中的 UITabBarController

以编程方式将 UITabBarController 中 TabBarItem 中的图标居中