【问题标题】:How to pop view controller to one of the previous view controllers in swift?如何快速将视图控制器弹出到以前的视图控制器之一?
【发布时间】:2014-12-08 05:28:12
【问题描述】:

我一直在尝试将我的视图控制器弹出到我的视图堆栈中以前的视图控制器之一。假设,我的视图堆栈中有 firstVC、secondVC、thirdVC 和 FourthVC 视图控制器。当前视图控制器是第四个,第四个VC中有一个tableview。如果用户删除 tableview 中的所有行,我应该将用户引导到 secondVC。我有一个想法,我将创建另一个导航控制器并使用 presentViewController 命令呈现它。但是,这不是我的问题的解决方案。因为我认为这种情况下会出现导航问题。我怎样才能找到这种情况的最佳解决方案?

感谢您的回答, 最好的问候

【问题讨论】:

  • 如果您使用故事板,您可以使用展开转场。
  • 我不使用故事板,我使用 xib 文件。有解决办法吗?

标签: ios iphone swift


【解决方案1】:

不要进行通用的popViewControllerAnimated: 调用,而是使用popToViewController:animated:。您可以检测用户是否删除了所有行,在这种情况下,请执行以下操作(否则只需弹出一个视图控制器):

let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 2], animated: true);

【讨论】:

  • 好答案! @AaronWojnowski
  • 我创建了一个更安全的 UIViewController 扩展,我还创建了第二个扩展以返回特定的视图控制器。 stackoverflow.com/a/44626461/2370587
【解决方案2】:

如果你想弹出到一个特定的视图控件并且不知道返回的计数你可以使用这个:

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers as! [UIViewController];

        for aViewController in viewControllers {
            if(aViewController is ViewControllerYouWantToGoTo){
                 self.navigationController!.popToViewController(aViewController, animated: true);
            }
        }

【讨论】:

  • 非常适合我!
  • 我得到这个崩溃结果:致命错误:在第一行代码展开可选值时意外发现 nil
  • @bluGeni 你能给我代码去主导航控制器的根视图控制器吗,因为我有多个。
【解决方案3】:

经过大量努力,我在 Swift 3.0 中创建了返回到特定视图控制器的快速扩展。

extension UINavigationController {

    func backToViewController(viewController: Swift.AnyClass) {

            for element in viewControllers as Array {
                if element.isKind(of: viewController) {
                    self.popToViewController(element, animated: true)
                break
            }
        }
    }
}

方法调用:

   self.navigationController?.backToViewController(viewController: BarCodeScannerVC.self)

【讨论】:

  • 不错的扩展!但我不认为Array 是必要的了兄弟。
  • 非常感谢。
  • 即使使用 Swift 5 也能像魅力一样工作
【解决方案4】:

在这里,您可以通过从 UINavigationController 堆栈中查找控制器并在 for 循环的帮助下检查您想要的控制器的条件,如果条件得到满足,它将弹出到目标控制器。

let viewControllersStack: [UIViewController] = self.navigationController!.viewControllers
      for firstViewcontroller in viewControllersStack
      {
           if firstViewcontroller is desireViewController
           {
                self.navigationController!.popToViewController(firstViewcontroller, animated: true)
           }
      }

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2015-03-25
    相关资源
    最近更新 更多