Deinit没有调用Show Detail segue

时间:2015-01-13 02:11:15

标签: ios swift ios8 uistoryboard uistoryboardsegue

我在一个更大的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方法。

我已经通过使用自定义segue获得了我想要的行为,但我的问题是:这种行为是否可以预期?

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

Source

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

我原以为替换当前视图控制器堆栈的顶部会导致当前视图控制器被取消初始化。

显示详细信息的替代

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

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

        source.view.window?.rootViewController = destination
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

如果您没有使用导航控制器或拆分视图控制器,则“显示详细信息”segue与模式显示相同。一个呈现另一个的控制器在其presentViewController属性中保留对它的引用(并且呈现的控制器在其presentViewController属性中引用了该呈现器)。因此,没有一个控制器将被解除分配。如果要返回上一个控制器,则应使用展开segue或在代码中使用dismissViewControllerAnimated:completion。