在切换到 UITabbarController 中的不同选项卡之前关闭当前选项卡上的推送视图控制器

Posted

技术标签:

【中文标题】在切换到 UITabbarController 中的不同选项卡之前关闭当前选项卡上的推送视图控制器【英文标题】:Dismiss a pushed view controller on current tab before switching to a different tab in UITabbarController 【发布时间】:2019-12-24 07:00:10 【问题描述】:

我有带有三个选项卡的 tabbarcontroller 和 nav1、nav2、nav3 作为它们的 navigationContollers。将新的 viewcontroller(pVC) 推送到 nav1 的 rootViewController 后,单击第二个或第三个选项卡,那么如何在 secondTabs nav2 的 rootVC 出现之前关闭 pushViewController pVC? 以下是tabar的设置方式

tabbar.setViewControllers([
                nav1,
                nav2,
                nav3
            ]
            .compactMap( $0.toPresent ),
            animated: false
        )

【问题讨论】:

你应该改进你的问题。如果你不改进其他用户对你的问题没有帮助。 @EmreDeğirmenci 我改进了它,所以现在更容易理解了。 【参考方案1】:

这不是 ios 的工作方式。用户期望他们的选项卡层次结构在选择不同的选项卡时保持不变。每次选择不同的选项卡时弹出的目的是什么?也许您的 UI 模型实际上应该是一个模态展示或某种其他类型的交互。

鉴于此,如果您坚持通过违反 HIG 来惹恼您的用户,您可以通过成为 UITabBarControllerDelegate 并实施 tabBarController(_:shouldSelect:) 来做到这一点。在这里,做你的pop到root,然后返回true。请记住,这是一个同步函数。制作这个动画并非易事,因为UINavigationController 的动画没有很好的挂钩。没有完成处理程序等,就像模态演示一样。这是非动画版:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
  // you need a reference to your nav controller
  if let navController = tabBarController.selectedViewController as? UINavigationController 
    navController.popToRootViewController(animated: false)
  

  return true 

【讨论】:

以上是关于在切换到 UITabbarController 中的不同选项卡之前关闭当前选项卡上的推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在切换到 UITabbarController 中的不同选项卡之前关闭当前选项卡上的推送视图控制器

UIRefreshControl 在 UITabBarController 中切换选项卡后卡住

从单独的 UIViewController 切换 UITabBarController 选项卡[重复]

在 UITabbarController 中切换选项卡时的 popToRoot UINavigationController

如何在 UITabBarController 中获取特定 UIViewController 的索引

在我切换选项卡之前,viewWillAppear 不会为属于 UITabBarController 的 UIViewController 触发