我在一个较大的 Swift 项目中遇到了这个问题,但能够在一个非常基本的项目中复制它。我有以下视图控制器类:
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)
}
}
我的故事板已配置,因此有两个视图控制器,都使用上面的类并带有Show Detail
segues 互相指向。我可以确认它们来回“弹跳”。尽管每次都会显示一个新实例,并且没有保留周期,但先前显示的视图控制器的deinit
方法未被调用。
我已经能够通过使用自定义转场来获得我想要的行为,但我的问题是:这种行为是预期的吗?
该文档似乎表明它应该按照我的预期工作,我已经突出显示了我认为适用于我的测试项目的部分。
Source https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html
在详细信息区域中显示内容。如果应用程序显示主视图和详细信息视图,则新内容将替换当前详细信息。 如果应用程序仅显示主视图或细节视图,则内容将替换当前视图控制器堆栈的顶部。
我本以为替换当前视图控制器堆栈的顶部会导致当前视图控制器被取消初始化。
显示详细信息的替代方法
作为参考,我能够通过这个 segue 实现我想要的行为(这没有做任何花哨的事情,并且可能是不正确的):
class ExampleSegue: UIStoryboardSegue {
override func perform() {
let source = self.sourceViewController as UIViewController
let destination = self.destinationViewController as UIViewController
source.view.window?.rootViewController = destination
}
}
感谢您的帮助!