在UINavigationController中推入UITabBarController是否可行?我曾经在旧版本的iOS中阅读过相关内容,但现在是否仍然如此?
在UINavigationController中推入UITabBarController是否可行?我曾经在旧版本的iOS中阅读过相关内容,但现在是否仍然如此?
UITabBarController
。但仅仅因为你可以使用它,并不意味着你应该这么做。UITabBarController
被设计成在根级别作为viewController(app窗口的rootViewController)使用,旨在为用户提供最佳(且易用)的用户体验。苹果建议保持应用程序的视图层次结构,使得从一个视图控制器到另一个视图控制器只有一条路径。UITabBarController
的方式是将其设置为rootViewController
,并为每个“选项卡”分配UIViewControllers
。如果您想要能够从这些视图控制器推入/弹出,则可以为每个选项卡分配一个UINavigationController
,并且它们具有自己的rootViewController
,就像Facebook iOS应用程序一样。UINavigationController
中,则建议在每个选项卡中使用简单的viewControllers
,而不是UINavigationController
,以避免多个视图层次结构。其余的则由您作为开发人员自行决定。在任何情况下,编码容易性都不应影响最终用户的体验,用户体验始终是最重要的。Create a UITabBarController
.
You set the root view controllers for each tab using:
tabBarController.viewControllers = [NSArray arrayWithObjects:
alphaController,
betaController,
nil];
Push it onto your navigation controller.
In the viewDidLoad
method of your UITabBarController
class (advised to subclass), you set it's UITabBar
's items (UIBarButtonItems
).
通过使用UITabBarControllerDelegate
,您可以处理选项卡的选择。您不一定需要在选项卡选择时显示viewControllers。您可以通过覆盖shouldSelectViewController:
方法来改变它们的行为。
苹果公司说不行,但这里有一篇关于第二部分代码的俄语指南http://arm1.ru/blog/ispolzovanie-uinavigationcontroller-vmeste-s-uitabbarcontroller
最近我在开发一个应用程序,其中UITabbarController被推入UINavigationController中。这个应用程序目前已经在苹果商店上架。
我不知道为什么苹果不推荐这样做,以及为什么人们会遇到问题。
@Slashik的回答就是一个例子,我也是用了同样的方法。
我发现了一种情况,即在UINavigationController
内部的UITabBarController
不按预期工作。 重现错误的代码:
ViewController.swift
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(someSelector))
}
}
SceneDelegate.swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = createRootViewController()
window.makeKeyAndVisible()
self.window = window
}
fileprivate func createRootViewController() -> UIViewController {
let viewController = ViewController()
let tabBarController = UITabBarController()
tabBarController.viewControllers = [
viewController
]
let navigationController = UINavigationController()
navigationController.pushViewController(tabBarController, animated: false)
return navigationController
}
createRootViewController
改写为以下内容:let viewController = ViewController()
let tabBarController = UITabBarController()
tabBarController.viewControllers = [
UINavigationController(rootViewController: viewController)
]
return tabBarController
然后出现“添加”按钮。
因此,如果您不想花费几个小时进行调试,最好遵循他们的建议。我不知道SDK的开发人员为什么没有在那里添加一个断言。