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

Posted

技术标签:

【中文标题】使用自定义 segue 在导航堆栈上向后移动【英文标题】:Using a custom segue for moving backwards on a navigation stack 【发布时间】:2012-05-04 07:14:09 【问题描述】:

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

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

我的应用使用普通的导航控制器。为了“向前”移动到新的视图控制器,我使用了自定义 segue;那里没有问题。但是,在应用程序中有一点我想回到导航堆栈的开头。我还使用自定义 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 足够聪明,可以意识到我想导航到以前存在的实例视图控制器,而不是创建一个新实例,它分配给“dest”现有的实例。

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

提前非常感谢!

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

非常感谢您的回答!你已经证实了我的怀疑。我错过了你提到的关于 100% 肯定的静态计数器的技巧,将记住这一点以备将来需要。至于解决方案,我将实现“向后”导航,没有segues,没什么大不了的......这样StoryBoard会看起来更干净:) @psyco 如何与 ARC 一起使用?如何释放 DestinationController?

以上是关于使用自定义 segue 在导航堆栈上向后移动的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C:导航栏自定义Segue效果对比Show Segue

自定义 segue 和导航控制器动画故障

从自定义 UIViewController 导航到 TabBarController 而不使用 segue

从自定义导航栏展开 segue 后,如何切换回默认导航栏外观?

在导航栏按钮项中添加自定义图像时丢失 Segue 操作

自定义 segue 到导航控制器层次结构中的特定子视图