ios - Xcode 11.3、UInavigationController 和 UITabbarController 面临的问题
问题描述
简介:我在 中嵌入了 4 个控制器UINavigationController
,然后通过代码将它们用作 中的选项卡UITabbarController
(没有故事板和 .xib)。
以前我使用的是 Xcode 10.3,没有问题,但在我更改为 11.3 后,这些问题出现了。
问题:
当我点击选项卡时,控制器上的 viewWillAppear 和 viewDidAppear 没有被调用。
导航到任何控制器后从任何控制器弹回(按下返回按钮)都没有动画。
代码标签栏控制器:
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+ 中开箱即用地运行它。
在 iOS 13/XCode11 之前,应用程序的起点是,AppDelegate
但现在在 Xcode 11+ 中,SceneDelegate
分担了一些责任。即window
配置应该在scene(:willConnectTo:)
功能中完成。
我忘了为此添加 SceneDelegate.swift 和 Info.plist 键。
感谢@DonMag帮助我。