在 Swift 中 segue 后从堆栈中删除(删除)视图/视图控制器的正确方法

Posted

技术标签:

【中文标题】在 Swift 中 segue 后从堆栈中删除(删除)视图/视图控制器的正确方法【英文标题】:Correct way of removing (deleting) a view/viewController from the stack after segue in Swift 【发布时间】:2015-06-12 01:40:01 【问题描述】:

我在这里遇到了问题。我正在使用performSegueWithIdentifier 提出意见。一切都很顺利。问题是,作为测试,我只有 2 个视图控制器,其中包含一些数据,并且我有两个按钮可以将 segue 调用回另一个 VC。如果我继续执行Segues,您可以清楚地看到内存使用量每两个segues 增加约0.4Mb。这告诉我视图没有被从视图堆栈中删除/删除,只是在使用内存。我想知道使用performSegueWithIdentifier 摆脱呈现另一个视图的视图的正确方法(当然,在它完成呈现视图之后,我猜它不会起作用)。

你能指出我正确的方向吗?我发现了一些 Objective-C 代码试图做到这一点,但它非常广泛,而且我对 Objective-C 了解不多,所以对我来说有点难以理解。

提前感谢您的帮助!

干杯!

编辑:


我正在做一个“手动转场”。我的意思是我有两个独立的视图控制器。它们没有嵌入任何导航VC 或类似的东西中。我正在使用“Show”类型的“Adaptive Segue”。

【问题讨论】:

【参考方案1】:

如果您的目标是始终保留一个 VC,并且由于您已经有一个手动 segue,那么您可以做的是,在呈现下一个 VC 后,您可以从根目录弹出现有 VC 并将目标 VC 分配为您的根目录VC就是这样

class ManualSegue: UIStoryboardSegue 

  override func perform() 
    sourceViewController.presentViewController(destinationViewController, animated: true) 
      self.sourceViewController.navigationController?.popToRootViewControllerAnimated(false)
      UIApplication.sharedApplication().delegate?.window??.rootViewController = self.destinationViewController
    
  

【讨论】:

【参考方案2】:

当你做普通的 segues 时,你是在现有的视图控制器之上堆积新的视图控制器,而不是解雇它们。这就是您的内存使用量不断上升的原因。

您需要提供更多信息,然后我们才能为您提供具体指导。您是在做模态转场还是推送到导航堆栈?

如果你正在推动,你想弹出到你来自的视图控制器。想想一堆盘子。当你推动时,你将盘子添加到堆栈中。当你弹出时,你取下盘子并露出下面的盘子(视图控制器)。在 Xcode 帮助系统中的“PopTo”上进行搜索,找到可以让您弹回特定视图控制器或返回导航控制器根视图控制器的方法。

模态视图控制器以类似的方式堆叠在一起,但没有导航控制器的起源。如果您推送了一系列一个或多个模态,并且您将 dismissViewControllerAnimated:completion: 方法发送到您想要返回的视图控制器,它将关闭其顶部的模态。

你也可以看看使用 unwind segues。 Unwind segues让你回到你来的地方。在 Xcode 帮助系统中搜索“Using unwind segues”以获取更多信息。大多数关于 unwind segues 的教程都是用 Objective-C 编写的,但是如果你看的话,你应该能够在 Swift 中找到一些。足够详细地解释 unwind segues 是有用的,这超出了我在这个答案中所能涵盖的范围。

【讨论】:

请参考我上面的更新。是的,确实,我想从堆栈中弹出我来自的 VC。这会解决我的记忆问题吗?因为它会“删除”我来自的 VC,对吗?感谢您的时间和帮助!

以上是关于在 Swift 中 segue 后从堆栈中删除(删除)视图/视图控制器的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中 3 秒后从 AppDelegate 中删除FromSuperview

在 Xcode 8 和 Swift 3.0 中删除覆盖后准备 segue 崩溃

如何在更新 conda 后从终端提示符中删除(基础)

删除 Bridging Header 后从 Interface Builder 拖动时 Xcode 崩溃

使用 Swift 在没有情节提要的情况下展开 segue

没有情节提要的 TableView Cell 的 iOS Swift Segue