使用内存密集型应用程序处理segues / storyboards

时间:2013-02-01 11:09:19

标签: ios objective-c xcode uistoryboard uistoryboardsegue

我有一个具有以下基本布局的应用程序,请理解我已经完成了很多编程,但我对IOS来说相对较新,而且尚未正确地理解Storyboards / segues。

实际上,我的应用程序有以下屏幕:

WelcomeViewConroller --- ModalSeque - > MenuViewController --modalSegue ---> newProjectVC || loadprojectVC --- modalSegue - > ProjectScreenVC。

从项目屏幕,用户可以返回menuVC屏幕。

现在,我明白每个segue都会创建一个视图控制器的新实例,这很棒,我希望这种情况发生,但是,当我从ProjectScreen中退出,然后再次重新输入时,我获得了巨大的记忆泄漏和非常奇怪的行为。

我知道我需要解雇我的View控制器,特别是当我离开它时我的ProjectScreen,但是,无论我尝试什么,我都无法实现这一点。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

How should I chain viewcontrollers in xcode storyboard?中,我列举了一系列回归故事板中多个场景的方法。但简而言之,两个最简单的选择是:

  1. 展开segues:如果仅支持iOS 6或更高版本,请使用展开segues。因此,例如,在主菜单的视图控制器中,实现一个展开segue:

    - (IBAction)gotoMainMenu:(UIStoryboardSegue *)segue
    {
        // if you need to do anything when you return to the main menu, do it here
    }
    

    还要确保在主菜单中定义.h。然后 control +从想要segue的按钮拖动到场景下方面板中的“退出”按钮,然后选择“gotoMainMenu”选项:

    hook up unwind segue

  2. 导航控制器:如果您需要iOS 5支持,那么只需使用导航控制器并用push segues替换模态segue。然后,您可以使用popToViewControllerpopToRootViewControllerAnimated跳回多个场景。如果您不想显示导航栏,请在故事板中选择导航控制器,然后在属性检查器中取消选中“显示导航栏”:

    uncheck shows navigation bar

    在这种情况下,我实际上认为最简单的方法是确保您的菜单场景是根(并让它稍微绕过欢迎屏幕,就像我在其他答案的第4点讨论的那样),在这种情况下你只要您想返回主菜单,就可以致电popToRootViewController。但是,如果主菜单不是根视图控制器,并且您想要弹回它,您可以将点菜单控制器从一个场景传递到另一个场景,或者您可以随后呈现视图控制器,当它们执行时,执行以下操作想回到主菜单:

    for (UIViewController *controller in [self.navigationController viewControllers])
    {
        if ([controller isKindOfClass:[MenuViewController class]])
        {
            [self.navigationController popToViewController:controller animated:YES];
            break;
        }
    }
    
  3. 在Stack Overflow的其他地方,你会看到人们正在考虑如何嵌入dismissViewControllerAnimated或其他类似的变种。我个人认为导航控制器和放松细分更容易,更优雅。