// // TabNavigationController.swift // suixinkan // import UIKit /// 单个 Tab 的导航栈。 final class TabNavigationController: UINavigationController { let appTab: AppTab init(tab: AppTab) { self.appTab = tab super.init(nibName: nil, bundle: nil) delegate = self navigationBar.prefersLargeTitles = false setViewControllers([tab.makeRootViewController()], animated: false) } @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func pushViewController(_ viewController: UIViewController, animated: Bool) { viewController.hidesBottomBarWhenPushed = viewControllers.count > 0 updateNavigationBarVisibility(for: viewController, animated: animated) super.pushViewController(viewController, animated: animated) } override func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) { if let topViewController = viewControllers.last { updateNavigationBarVisibility(for: topViewController, animated: animated) } super.setViewControllers(viewControllers, animated: animated) } override func popViewController(animated: Bool) -> UIViewController? { let poppedViewController = super.popViewController(animated: animated) if !animated, let topViewController { updateNavigationBarVisibility(for: topViewController, animated: false) } return poppedViewController } override func popToRootViewController(animated: Bool) -> [UIViewController]? { let poppedViewControllers = super.popToRootViewController(animated: animated) if !animated, let topViewController { updateNavigationBarVisibility(for: topViewController, animated: false) } return poppedViewControllers } private func shouldHideNavigationBar(for viewController: UIViewController) -> Bool { viewController is HomeViewController } private func updateNavigationBarVisibility(for viewController: UIViewController, animated: Bool) { setNavigationBarHidden(shouldHideNavigationBar(for: viewController), animated: animated) } } extension TabNavigationController: UINavigationControllerDelegate { func navigationController( _ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool ) { updateNavigationBarVisibility(for: viewController, animated: animated) } }