Xcode 11.3、UInavigationController和UITabbarController面临的问题

Xcode 11.3, UInavigationController and UITabbarController facing issues

简介: 我在 UINavigationController 中嵌入了 4 个控制器,然后在 UITabbarController 中用作选项卡,(没有故事板和 .xib)通过代码。

之前我用的是Xcode 10.3,没有问题,但是我换到11.3后就出现了这些问题。

问题:

  1. 当我点击选项卡时,控制器上的 viewWillAppear 和 viewDidAppear 没有被调用。

  2. 导航控制器有类似问题Xcode 11 UINavigationController Bar problems

  3. 导航到任何控制器后弹出(按后退按钮)没有动画。

代码 TabbarController:

final class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.viewControllers = [
            TabBarItems.home.tabController,
            TabBarItems.search.tabController,
            TabBarItems.cart.tabController,
            TabBarItems.account.tabController
        ]

        self.tabBar.isTranslucent = false
    }
}

extension TabBarController {
    enum TabBarItems {
        case home
        case search
        case cart
        case account

        var title: String {
            switch self {

            case .home:
                return "Home"
            case .search:
                return "Search"
            case .cart:
                return "Bag"
            case .account:
                return "Account"
            }
        }

        var tabController: UINavigationController {
            switch self {

            case .home:
                return createNavController(viewController: HomeController(), title: self.title, imageName: Assets.home.rawValue)
            case .search:
                return createNavController(viewController: UIViewController(), title: self.title, imageName: Assets.search.rawValue)
            case .cart:
                return createNavController(viewController: BagController(), title: self.title, imageName: Assets.shoppingBag.rawValue)
            case .account:
                return createNavController(viewController: AccountController(), title: self.title, imageName: Assets.account.rawValue)
            }
        }

        private func createNavController(viewController: UIViewController, title: String, imageName: String) -> UINavigationController {
            let navController = UINavigationController(rootViewController: viewController)
            viewController.view.backgroundColor = .white
            navController.tabBarItem.title = title
            navController.tabBarItem.image = imageName.image
            return navController
        }
    }
}

问题出在 XCode 10.3 中创建的项目,并试图 运行 在 XCode 11+ 中开箱即用。

在 iOS13/XCode11 之前,应用程序的起点是 AppDelegate,但现在 Xcode11+,SceneDelegate 分享了一些的责任。即 window 配置应该在 scene(:willConnectTo:) 函数中完成。

我忘记为此添加 SceneDelegate.swift 和 Info.plist 键。

感谢 @DonMag 帮助我。