【问题标题】:Popping multiple controllers off navigation controller nil?从导航控制器中弹出多个控制器为零?
【发布时间】:2018-06-07 16:14:40
【问题描述】:
for _ in 2...numNavControllers {
    let vc = navigationController?.popViewController(animated: true)
    print("\(String(describing: vc))")
}

我正在尝试弹出多个视图控制器,而正在发生的是循环的第一次迭代,它将成功弹出顶部视图控制器,但之后的每次迭代都弹出视图控制器为零。这是怎么回事?有多个视图控制器(至少 4 个),我已经通过 print 语句确认了这一点。

谢谢!

【问题讨论】:

  • 为什么要循环执行此操作?为什么不根据需要使用popToRootViewControllerpopToViewController
  • 使用这些功能在我的应用程序中出现奇怪的错误,尝试弹出到根目录然后立即推送新控制器会导致奇怪的 UI 错误,新控制器出现在来自底部的新屏幕中屏幕(而不是通常的动画从左到右),然后新屏幕缺少整个导航栏...
  • 所以这和your previous question有关。
  • 好吧,我从不同的角度接近它,想知道是否有人能告诉我为什么多个 pop 调用返回 nil
  • 您还设置了动画:true,因此完成第一次弹出需要一段时间。但你不是在等待弹出下一个。弹出第一个时,您不能弹出第二个。根据您在下面的评论,您可以使用popToRootViewController 并在不制作动画的情况下推送相关的 VC。 (您可能需要使用 DispatchQueue 使用单独的线程)

标签: ios swift uiviewcontroller


【解决方案1】:

尝试这样的方法而不是使用 for 循环:

var numberOfPops: Int = 3
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
self.navigationController!.popToViewController(viewControllers[viewControllers.count - numberOfPops], animated: true)

【讨论】:

  • 您好,谢谢您的建议!我一直在尝试处理的问题如下:我想将所有视图控制器弹出到根目录,然后立即将一些视图控制器推送到堆栈上(基本上用户单击指向特定文件夹的链接,并且我想导航到该文件夹​​-因此上升到根目录,然后推送控制器的正确路径)。但是,当我按照您的建议进行操作时,它会将控制器弹出到根目录,但是当我将新控制器推入堆栈时,它会从底部创建一个全新的屏幕(并且顶部的导航栏丢失)
  • 想知道这是否可能是线程问题或竞争条件,弹出到根目录,然后立即推送新控制器...导致推送的新控制器看似放置在新控制器上...
  • @IsaacZhang 为什么不将 pushViewControllers Bool 传递给“初始”控制器。如果 pushViewControllers == true 则推送下一个控制器。如果该控制器 pushViewControllers == true,请执行完全相同的操作。
猜你喜欢
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多