【问题标题】:retrieving stack of ViewControllers when segueing programmatically以编程方式进行 segue 时检索 ViewController 堆栈
【发布时间】:2017-06-13 05:52:25
【问题描述】:
static func showMenuView(parentVC:UIViewController){
let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let resultController = storyboard.instantiateViewController(withIdentifier: "menuViewController") as? MenuViewController;
    let segue:DragDownSettingSegue = DragDownSettingSegue.init(identifier: "", source: parentVC, destination: resultController);
    parentVC.prepare(for: segue, sender: nil);
    segue.perform();
}

我正在以编程方式对视图控制器进行排序。 ViewController A 到 B,然后 B 到 C,然后 C 到 D,然后 D 到 B。B 中有一个“返回”按钮。所以当我从 B 返回时,我想去 A。所以为此,当 D 到 B 时,我想从堆栈而不是 A 和 B 中清除所有视图视图控制器。 问题:我无法获得堆叠视图控制器的列表。

【问题讨论】:

  • 您是否在导航控制器中嵌入了第一个视图控制器,即 A?您使用的 segue 类型是什么?

标签: ios objective-c iphone swift xcode


【解决方案1】:

UINavigationController 将其视图控制器保存在一个 navigationController.viewControllers 属性中,该属性是一个数组。

let viewControllers = navigationController.viewControllers
print(viewControllers)

您可以检查该值以查看导航堆栈。

【讨论】:

  • self.navigationController 为零。
【解决方案2】:

您可以使用

获取视图控制器数组
let viewControllers: [UIViewController] = self.navigationController!.viewControllers

然后您可以使用 popToViewController 函数弹出到特定的视图控制器。例如

self.navigationController!.popToViewController(viewControllers[2], animated: true)

【讨论】:

  • self.navigationController 为零。
  • 那么您可能没有正确推送视图控制器。能否请您上传视图控制器 ABC 和 D 的故事板屏幕截图
【解决方案3】:

使用展开转场:)

您不需要手动清除 viewController 的堆栈。将展开的转场从 B 拖到 A。这就是你所需要的 :)

编辑:

我相信你混淆了 UnwindSegue 的概念。 Unwind segue 不仅仅是从一个视图控制器跳到另一个视图控制器的方式。当您执行从 ViewController B 到 View Controller A 的 Unwind segue 时,不仅会加载 ViewController A,而且推入其间的所有中间 ViewController 也会被取消分配。

这是证据:)

我的 ViewController A 的 ViewwillAppear

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print(self.navigationController?.viewControllers.count ?? 0)
}

我的 ViewController A 的展开转场

@IBAction func unwindToA(segue: UIStoryboardSegue) {
    //perform whatever u have to do before unwind segue completes 
}

这是我的流程。

VCA -pushs-> VCB -pushs-> VCC

然后我从 VCC 到 VCA 展开 segue。因此,正如预期的那样,执行 unwindSegue VCA 的 viewWillAppear 会被调用。正如预期的那样,navigationController 的 viewController 计数为 1。这是我的 VCA。很明显,VCB 与 VCC 一起被释放了。

你可以写dealloc/deinit来确认释放:)

最后,当您可以使用诸如segueunwind seguepopToRootViewController 之类的方法来实现相同的效果时,最后永远不要手动弄乱 NavigationController 的 ViewController 堆栈。

希望对你有帮助

【讨论】:

  • 我想从内存中清除视图控制器,这些控制器现在没有链接到任何其他控制器。如果我不这样做,每个视图控制器的对象都会重复,并且会占用大量内存
  • @wasim-ahmed :不,先生,它不会。请再次阅读 unwind segue 并查看我的更新答案,证明在执行 unwind segue 时所有中间 VC 都会被释放。
猜你喜欢
  • 2017-05-12
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多