Sco*_*oop 5 memory-management uiviewcontroller ios segue
我有一个iPad应用程序,它有很多屏幕和很多segue选项.目前,我只是使用performSegueWithIdentifier来启动这些segue,我担心的是,当用户执行越来越多的segues时,我占用了大量内存.我见过人们推荐使用函数popToRootViewControllerAnimated:如果使用UINavigationController,但问题是我没有使用它.如何阻止VC的数量激增?应用程序的工作方式,用户不断返回到根VC - 实际上是一个搜索屏幕.因此,如果我需要在需要这样一个segue时清除VC的堆栈,那我认为这将解决我的问题,但我不知道如何解决这个问题.谢谢你的任何建议.
Fog*_*ter 10
当您使用segues时,流程会前后移动.当用户向后移动(即按下"后退")时,它将不会推送到新的VC,但它将弹出到已存在的VC.弹出时,将从堆栈和内存中删除当前VC.
如果你在流程中有向后移动的segues,那么这是错误的.你只需要segues继续前进.
正确的法国准备
在准备segue时,你永远不应该创建自己的视图控制器并推送它们.故事板可以为您完成所有这些.
一个适当的prepareForSegue方法应该看起来像这样......
- (void)prepareForSegue:(UIStoryBoardSegue*)segue
{
if([segue.identifier isEqualToString:"SomeSegue"])
{
MyNewViewController *controller = segue.destinationViewController;
controller.someProperty = "some value to pass in";
}
}
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的一切.请注意,如果您打算将某些信息传递给新的视图控制器,则只需要此选项.如果你没有向前传递任何东西,那么根本不需要这种方法.
当方法结束时,新的VC将被故事板文件推送到屏幕上.
UNWIND SEGUES
如果您有随机流(如评论中),那么您可以使用展开segues来实现此目的.
在你'A'视图控制器有一个像...的功能
- (IBAction)someUnwindAction:(UIStoryboardSegue*)sender
{
//some action to run when unwinding.
}
Run Code Online (Sandbox Code Playgroud)
它需要接收UIStoryboardSegue对象.如果设置为IBAction,您也可以从Interface Builder访问它.
现在,当你想要去A> B> C> B> A然后只使用标准的push和pop(来自segue和back按钮).
当你想要A> B> C> A然后你可以使用来自控制器C的展开segue.
如果你有一个取消按钮或控制器C中的东西,这是在界面生成器中,这应该会带你回到控制器A.然后在控制器C下面的界面生成器中,你将有一个带有门和箭头指向的绿色小方块出来的.只需将取消按钮的操作指向此符号,然后选择"someUnwindAction"即可.(注意,unwindAction在A中,按钮在C中.)然后XCode使用它来弹回你一直回到A并处理删除任何内存和东西.如果您愿意,您也可以将其他信息发回给A.
如果你想以编程方式从C访问这个unwind segue,那么你可以运行...
[self performSegueWithIdentifier:"someUnwindAction" sender:nil];
Run Code Online (Sandbox Code Playgroud)
这也将弹回A.