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

时间:2012-05-04 07:14:10

标签: ios ios5 uinavigationcontroller segue uistoryboardsegue

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

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

我的应用使用普通的导航控制器。为了“向前”移动到新的视图控制器,我使用自定义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足够聪明,可以实现我想要导航到之前存在的实例查看Controller,而不是创建新实例,它将“dest”分配给现有实例。

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

提前多多感谢!

1 个答案:

答案 0 :(得分:2)

  •   

    因为segue正在实例化View,我是否会浪费内存   控制器我不会用?

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

  •   

    有人知道以这种方式使用segues是否合适?

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

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

  •   

    它是否有可能是偶然的,但可能会停止工作   将来

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