在iOS中pipe理和解除多个视图控制器

我是iPhone的新手程序员。 在开发我的第一个游戏/应用程序时,我为自己提出了一个问题(创build了一个问题)。 我研究了这一点,并认为我已经看到了答案,但我不明白如何使它们适用于我的应用程序。

我有一个有几个视图控制器的游戏:欢迎,播放,高分,首选项和关于。 我没有一个导航控制器或我知道的根控制器。 编辑 – 我现在有一个rootview控制器 – 我添加[self.window setRootViewController:viewController]; 到我的appDelegate.m文件

从欢迎屏幕/ viewcontroller我可以去播放视图控制器,关于视图控制器,高分视图控制器或prefs视图控制器。 我想让现在掌pipe的新控制器负责,这样我就可以closures欢迎视图控制器。 事实上,任何时候我去视图控制器,我想能够从内存中解雇任何其他视图控制器 – 特别是我刚刚来自。 我可以去大多数视图控制器大多数视图控制器。

我使用这个去新的视图控制器:

 - (IBAction)playGameAction:(id)sender { FlipTestViewController *myViewController = [[FlipTestViewController alloc] initWithNibName:@"FlipTestViewController" bundle:nil]; [UIView beginAnimations:@"flipview" context:nil]; [UIView setAnimationDuration:1]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.view addSubview:myViewController.view]; [UIView commitAnimations]; } 

一旦我安全地在FlipTestViewController(播放控制器)中,我该怎么做让WeclomeViewController走? 我怎么告诉新的pipe制员,现在是负责人,其他人可以走了? 我甚至问一个有意义的问题吗? 回复时请用小字和具体的例子! 谢谢!

在rdelmar的build议下,我尝试添加一个调用来将RootvVewController更改为我的button代码 – 我用来调出新的viewController的代码:

 - (IBAction)playGameAction:(id)sender { FlipTestViewController *myViewController = [[FlipTestViewController alloc] initWithNibName:@"FlipTestViewController" bundle:nil]; [UIApplication sharedApplication].delegate.window.rootViewController = myViewController; [UIView beginAnimations:@"flipview" context:nil]; [UIView setAnimationDuration:1]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.view addSubview:myViewController.view]; [UIView commitAnimations]; } 

果然,然后我看看评论,FlipTestViewController(我的播放控制器)是新的RootViewController。 不幸的是,我得到一个空白的白色屏幕,没有任何types的转换和日志消息告诉我,我的FlipTestViewController中的ViewDidDisappear被以某种方式调用。 可能是因为欢迎屏幕仍然存在。 内存pipe理问题也许呢? 我应该把这个问题提出一个新的问题吗?

我只是改变了main.xib文件的背景颜色,显然这是显示的屏幕(空白的白色屏幕)。

这听起来像实现你想要的最简单的方法就是重置应用程序窗口的rootViewController属性。 从应用程序中的任何位置,您都可以通过[UIApplication sharedApplication] .delegate.window.rootViewController获取对根视图控制器的引用。 因此,无论您使用哪种操作方法切换到下一个视图控制器,都可以分配init控制器,然后将窗口的rootViewController属性设置为该控制器。 如果你没有别的引用控制器的话,那么当你重置属性的时候,旧的应该被重新分配(这可能是也可能不是你想要的 – 你可能想要一些属性来跟踪高分或者在哪里例如玩家在游戏中)。

在应用程序委托中,通常有这样的代码(当你开始一个单一的视图项目):

  WelcomeController *welcome = [[WelcomeController alloc] initWithNibName:@"ViewController" bundle:nil]; self.window.rootViewController = welcome; 

所以我会在你的应用程序委托中join类似于你想在启动时显示的任何视图控制器的东西。 然后在你的视图控制器代码(或者你把button切换视图控制器的地方),你会有类似的东西(我在我的testing项目中使用了分段控件):

 -(IBAction)selectController:(UISegmentedControl *)sender { if (sender.selectedSegmentIndex == 0) { PlayViewController *player = [[PlayViewController alloc] initWithNibName:@"PlayViewController" bundle:nil]; [UIApplication sharedApplication].delegate.window.rootViewController = player; }else{ HighScores *scorer = [[HighScores alloc] initWithNibName:@"HighScores" bundle:nil]; [UIApplication sharedApplication].delegate.window.rootViewController = scorer; } } 

要以模态方式呈现视图控制器,您可能需要尝试以下方法:

 - (IBAction)playGameAction:(id)sender { FlipTestViewController *myViewController = [[FlipTestViewController alloc] initWithNibName:@"FlipTestViewController" bundle:nil]; myViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentViewController:myViewController animated:YES completion:nil]; } 

这将FlipTestViewController放置在当前视图的顶部,并具有翻转过渡样式。

然后closures视图控制器,你可以把它连接到FlipTestViewController中的一个控件(通常是一个button):

 - (IBAction)dismissViewController:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } 

这与视图控制器使用相同的翻转animation消除

一个简单的方法是使用导航控制器。 你可以得到push / popping的好处,这有助于屏幕的顺序。

然后你可以popup到一个特定的控制器:

 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 

这允许你去一个已经提交的特定的视图控制器,而不需要经过其他所有的控制器。

另外,有点不太为人所知,你可以用整个控制器堆栈来代替

 - (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated 

它也用位于索引零的控制器代替基本控制器。

所以,你可以很容易地获得顶部的工具栏和所有的导航控制器的function,当你只是想重置一切到单个控制器,你只是做…

  [navController setViewControllers:@[viewController] animated:YES]; 

编辑

这听起来像你不确定你想要什么。 因此,你应该给自己一些余地,而不是试图重新发明轮子。

我认为导航控制器是要走的路。 它已经知道如何pipe理多个控制器,并且使用setViewControllers可以使它看起来像是从任何控制器到其他控制器,但是您可以保留与您的主要工作中心相同的导航控制器。

否则,你仍然可以自己做这一切

 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion 

 - (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion 

你可以从你的根视图控制器调用它们。 当你想改变控制器时,它将会closures当前的控制器并显示新的控制器。