ios – 使用自定义segue在导航堆栈上向后移动

我正在将我的应用程序移动到故事板,到目前为止,非常好.

但是,我发现了一些我不太懂的东西,让我担心.如果有人能对此提供一些见解,我将不胜感激.

我的应用使用普通的导航控制器.为了“向前”移动到新的视图控制器,我使用自定义segues;没有问题.但是,应用程序中有一点我要回到导航堆栈的开头.我还使用自定义segue配置了“导航”,为此,我通过将最后一个视图控制器拖到第一个(对我来说已经很奇怪)在Interface Builder中创建了segue,并且我实现了自定义segue以下列方式执行方法:

-(void)perform
{
    UIViewController *src = (UIViewController *)self.sourceViewController;
    UIViewController *dest = (UIViewController *)self.destinationViewController;

    [src.navigationController popToRootViewControllerAnimated:NO];
    // Custom animation code here
}

……效果很好.但是,我不明白为什么会这样.在我看来,自定义segue应该实例化我的第一个视图控制器的新实例并将其指定为“dest”,但看起来segue足够聪明,可以实现我想要导航到之前存在的实例View Controller,而不是创建一个新实例,它分配给现有的“dest”.

有人知道以这种方式使用segue是否可以?它有可能是偶然的,但可能会在将来停止工作吗?我是不是在浪费内存,因为segue正在实例化一个我不打算使用的View Controller?

非常感谢提前!

最佳答案 >

Am I wasting memory in anyway as the segue is instantiating a View
Controller I’m not going to use?

  
  是的先生!通过使用segue,您可以有效地分配一个新的视图控制器,因为它需要为您的自定义segue设置DestinationController属性.自己测试:在你的根控制器中添加一个静态计数器,每次初始化这个类时都会增加它,并在你的视图中显示它:每当你使用这个技巧弹出到root时,你会看到它会增加.

>

Does anybody know if using segues in this way is ok?

  
  只要你有效地浪费记忆,不!

这个问题至少有一个解决方案:在你的(void)执行实现中释放segue的DestinationController.这真的很快实现,但有点丑,因为你每次都分配并立即释放你的视图控制器……即使它比泄漏更好,也不是我称之为好的做法!
在我看来,实现你想要的更好的方法是不使用segue进行转换,只是使用按钮或其他任何东西并调用popToRootViewController:触摸此按钮时动画.

>

Is it possible that it works by chance but might stop working in the
future?

  
  对于我建议的第一个解决方案和你目前的方式,我认为没有理由:这些都不是复杂的调整,只是“糟糕实施”的标准导航.第二种解决方案完全正常,所以不用担心.

点赞