如何隐藏 Tabbarcontroller 的第一个视图控制器并直接转到下一个控制器,但应该在底部显示标签栏项目

How to hide Tabbarcontroller's first view controller and go directly to the next controller but should show the tab bar items at the bottom

我有一个视图控制器作为我的初始视图控制器。其中有一个按钮(GO 按钮),当用户点击它时,它应该转到另一个视图控制器(我们称它为带有标签 'This is where i wanna go' 的目标视图控制器)。同时我想通过 Tabbar 控制器传递它。原因是我想在我的导航堆栈中有标签栏。 我希望在按下 go 按钮时直接转到 Destination 视图控制器,但它应该在底部显示选项卡栏项目。 因此,为了在 FirstViewController didLoadMethod 中实现这一点,我检查了一个 bool 值并将视图控制器推送到目标视图控制器。我实现了结果,即当按下 Go 按钮时,它会转到 Destination 视图控制器并且底部有标签栏项目。 但是问题是因为它通过 Tabbarcontroller FirstViewController 显示了几秒钟,然后它推送到目标视图控制器。我希望在发生此转换时隐藏 FirstViewController。 如何做到这一点? 图片显示了我想要的。将 firstviewcontroller 放在导航堆栈中时,我该怎么做才能隐藏它?

您尝试制作的效果很难在情节提要中实现。以编程方式,您只需创建 Tabbar 控制器(及其子控制器)和 "This is where I want to go" 控制器,然后要求导航控制器同时显示两者。

例如,在点击 "Go" 之后,这是我要在您的第一个视图控制器中 运行 的代码:

    let tabBarController = UITabBarController()
    let finalDestination = UIViewController()

    var viewControllers = self.navigationController?.viewControllers ?? []
    viewControllers.append(tabBarController)
    viewControllers.append(finalDestination)

    self.navigationController?.setViewControllers(viewControllers, animated: true)

我认为这可以通过简单的方式完成 -

  • 标签栏的第一个viewController有一个viewDidLoad()函数或者你可以使用loadView()在 viewDidLoad() 函数之前调用。推送到函数中的下一个viewController。

将您的推送导航代码放入其中一个函数中

*您看不到当前视图控制器,它会在加载标签栏初始视图控制器之前将屏幕推送到您需要的 viewcontroller。

希望对你有用。

或者>>>>你可以看看

let storyboard = UIStoryboard(name: "your_storyBoard_name", bundle: nil)
    let viewController1 = storyboard.instantiateViewController(withIdentifier: "firstViewController")
    let viewController2 = storyboard.instantiateViewController(withIdentifier: "secondViewcontroller")
    let controllers = [viewController1, viewController2]
    self.navigationController!.setViewControllers(self.navigationController!.viewControllers + controllers, animated: true)

鉴于您显示的结构,其中视图控制器 A 是 TabBar 的根视图控制器,您应该将第二个视图控制器 B 推送到视图控制器 A 的 willAppear 或 didLoad 内的导航堆栈上,根据您的个人业务逻辑(标志、条件等)。

这里的技巧 是将 pushViewController 或 setViewControllers 与 animated: false 一起使用,这样导航堆栈将在 willAppear/didLoad 并且它不会在 A 上显示 B 的推送动画。这样,在 onDidAppear 布局将已经完全呈现在它的最终状态:B 在导航堆栈的顶部并且没有正在进行的动画。