当前位置: 首页 > 知识库问答 >
问题:

如何在Swift中删除除一个外的所有视图控制器并弹出到指定的视图控制器?

康泽宇
2023-03-14

我有一组视图和一个注销按钮,它将用户注销并将他们带到第一个视图控制器(一个登录/注册屏幕)。我试着用模态表示来做这件事,但它破坏了我的导航,而且我不能使用pop到根视图控制器,因为它不是根视图控制器--我至少有2个导航控制器的深度。我怎么可能只显示第一个呢?我基本上需要它的行为,就好像应用程序刚刚重新启动。解开塞格会有什么帮助吗?谢谢

共有2个答案

帅彦
2023-03-14

我基本上需要它的行为,就好像应用程序刚刚重新启动。

在这种情况下,将登录/注册屏幕控制器分配给uiwindow.rootviewcontroller似乎是正确的选项。这里已经介绍了这个主题:Swift ios设置一个新的根视图控制器

沈嘉瑞
2023-03-14

假设使用UINavigationController,则可以将UINavigationController.setViewControllers(_:Animated:)方法与UINavigationController.ViewControllers结合使用。后者为您提供视图控制器的数组,其排列顺序与导航控制器的排列顺序完全一致,而前者可用于更改导航堆栈。例如,如果希望只保留导航堆栈中的前3个视图控制器:

guard let navigationController = self.navigationController else { return }
let viewControllersToKeep = navigationController.viewControllers.prefix(3)
navigationController.setViewControllers(viewControllersToKeep, animated: true)

注意:导航控制器在这种情况下执行的动画通常是(我相信总是,但不是100%确定)推送动画,而不是弹出,这可能不是想要的。

因此,如果你想让导航控制器执行一个弹出动画,那么你应该调用弹出,直到你到达想要的视图控制器,但关键是动画一个弹出。对于与上面相同的示例:

guard let navigationController = self.navigationController else { return }
let numberOfPops = navigationController.viewControllers.count - 3
for i in 0..<numberOfPops {
    let animated = i == 0
    navigationController.popViewController(animated: animated)
}

希望这回答了关于弹出到所需视图控制器的问题(您可以通过它的类型检测您的视图控制器,然后您可以找出它的索引并使用上面的逻辑)。

如果您想要解除到第一个呈现的视图控制器,那么您需要在第一个呈现的视图控制器上调用UIViewController.dismiss(animated:complety:)dismiss方法的行为如下:

  1. 如果视图控制器呈现一个视图控制器,则它将取消呈现的视图控制器;
  2. 如果视图控制器没有呈现任何视图控制器,但它由另一个视图控制器(即具有父视图控制器)呈现,则它将请求父视图控制器将其取消;
  3. 如果不符合上述条件,则不执行任何操作。

所以长话短说,您需要在视图控制器上调用Dissist以使您希望留在屏幕上。

 类似资料:
  • 问题内容: 我一直试图将我的视图控制器弹出到我的视图堆栈中的以前的视图控制器之一。假设在我的视图堆栈中有 firstVC,secondVC,thirdVC和fourthVC 视图 控制器 。当前的视图控制器是第四个,在fourthVC中有一个表视图。如果用户删除tableview中的所有行,则应将用户 定向 到 secondVC 。我有一个想法,我将创建另一个Navigationcontrolle

  • 问题内容: 我正在寻找一种简单的方法,可以一次从一个超级视图中删除所有子视图,而不是一个一个地删除它们。 我缺少什么? 更新 我的应用有一个main 。我必须添加其他不同的视图作为子视图,以便提供一种导航。 因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图。 更新2-可行的解决方案(OS X) 我猜苹果已经解决了。 现在,它比以往更容易了,只需致电: 问题答案: 编辑:(感

  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 问题内容: 我正在尝试使用以下代码弹出到根视图控制器: 这通常可行,但是当当前视图是模式视图时,尝试使用此代码时出现错误。在这种情况下,我该如何跳回到根视图控制器? 提前致谢。 问题答案: 您可以检查当前控制器是否存在,如果存在,则将其关闭,然后直接转到当前控制器。

  • 我的应用程序支持英语和阿拉伯语。我正在使用UIView。外观()。semanticContentAttribute属性在RTL到LTR之间更改,反之亦然,如下所示。 我正在使用self.present呈现日历事件EKEventEditViewController()(eventController,动画:true,完成:nil)。我想总是LTR显示这个屏幕。 我尝试了以下代码,但当我将语言更改为阿