ios - 显示详细信息转场时未调用 Deinit

标签 ios swift ios8 uistoryboard uistoryboardsegue

我在一个较大的 Swift 项目中遇到了这个问题,但能够在一个非常基本的项目中复制它。我有以下 View Controller 类:

class ViewController: UIViewController {
    deinit {
        println("Deinitializing")
    }
    
    override func viewDidAppear(animated: Bool) {
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "segue", userInfo: nil, repeats: false)
    }

    func segue() {
        self.performSegueWithIdentifier("segue", sender: self)
    }
}

我的 Storyboard已配置,因此有两个 View Controller ,两者都使用上述类并具有相互指向的Show Detail segues。我可以确认它们来回“弹跳”。尽管每次都会显示一个新实例,并且没有保留周期,但之前显示的 View Controller 的 deinit 方法不会被调用。

我已经能够通过使用自定义转场来获得我想要的行为,但我的问题是:这种行为是预期的吗?

文档似乎表明它应该按照我的预期工作,我已经突出显示了我认为适用于我的测试项目的部分。

Source

在详细信息区域中显示内容。如果应用程序显示主视图和详细信息 View ,则新内容将替换当前详细信息。 如果应用程序仅显示主视图或详细信息,则内容将替换当前 View Controller 堆栈的顶部。

我本以为替换当前 View Controller 堆栈的顶部会导致当前 View Controller 被取消初始化。

显示详细信息的替代方法

作为引用,我能够通过这个segue实现我想要的行为(它没有做任何花哨的事情,并且可能是不正确的):

class ExampleSegue: UIStoryboardSegue {
    override func perform() {
        let source = self.sourceViewController as UIViewController
        let destination = self.destinationViewController as UIViewController
        
        source.view.window?.rootViewController = destination
    }
}

感谢您的帮助!

最佳答案

如果您不使用导航 Controller 或 Split View Controller ,则“显示详细信息”segue 与模式演示相同。呈现另一个 Controller 的 Controller 在其presentedViewController属性中保留对其的引用(并且呈现的 Controller 在其presentingViewController属性中具有对演示者的引用)。因此,任何 Controller 都不会被释放。如果您想返回到上一个 Controller ,您应该使用展开转场或在代码中使用dismissViewControllerAnimated:completion。

关于ios - 显示详细信息转场时未调用 Deinit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27913934/

相关文章:

iphone - 关于在应用程序代码中检查基础 sdk

ios - 我的模板/通用 Swift 初始化程序/构造函数有什么问题?

ios - 使用 SWIFT Clean Architecture 处理无效的 Firebase 数据

ios - CRASH 尝试删除并重新加载相同的索引路径

iOS 模拟器在 Xcode 6.3 中无法运行

ios - 从文本字段中删除圆角,保持背景不透明度 iOS Swift

javascript - 如何调整 Javascript 元素的大小以适应其容器窗口

arrays - Swift:无法调用非函数类型的值 - 尾随闭包

swift - 在没有 Storyboard的情况下使用 UITableView

ios - 使用单个 Storyboard支持多种 iPhone 分辨率