4

我正在将我的应用程序移至 Storyboards,到目前为止,一切都很好。

但是,我发现了一些我不太了解并让我担心的事情。如果有人可以对此提供一些见解,我将不胜感激。

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

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

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

...效果很好。但是,我不明白它为什么起作用。在我看来,自定义 segue 应该实例化我的第一个视图控制器的新实例并将其分配为“dest”,但看起来 segue 足够聪明,可以意识到我想导航到以前的、现有的实例视图控制器,而不是创建一个新实例,它分配给“dest”现有的一个。

有谁知道以这种方式使用segues是否可以?它是否有可能偶然起作用但将来可能会停止工作?反正我是在浪费内存,因为 segue 正在实例化我不会使用的视图控制器?

提前非常感谢!

4

1 回答 1

2

  • 反正我是在浪费内存,因为 segue 正在实例化我不会使用的视图控制器?

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

  • 有谁知道以这种方式使用segues是否可以?

只要您有效地浪费内存,就不会!

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

  • 它是否有可能偶然起作用但将来可能会停止工作?

对于我建议的第一个解决方案和您当前的执行方式,我认为完全没有理由:这些不是复杂的调整,只是“执行不良”的标准导航。第二种解决方案是完全正常的,所以不用担心。

于 2012-05-04T08:30:46.380 回答