3

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

我有一个有几个视图控制器的游戏:Welcome、Play、High Scores、Preferences 和 About。我没有我知道的导航控制器或根控制器。编辑 - 我现在有一个 rootview 控制器 - 我添加[self.window setRootViewController:viewController];到我的 appDelegate.m 文件

从欢迎屏幕/视图控制器我可以转到 Play 视图控制器、关于视图控制器、高分视图控制器或首选项视图控制器。我想让我现在去的任何新控制器负责,这样我就可以关闭 Welcome 视图控制器。事实上,每当我使用视图控制器时,我都希望能够从内存中删除任何其他视图控制器——尤其是我刚刚来自的那个。我可以从大多数视图控制器转到大多数视图控制器。

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

- (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 离开?我如何告诉新控制器它现在负责并且其他控制器可以离开?我什至在问一个有意义的问题吗?回复时请用小词和具体例子!谢谢!

根据 rdelmar 的建议,我尝试添加一个调用以将 RootvVewController 更改为我的按钮代码 - 我用来调出新 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(我的Play Controller)就是新的RootViewController。不幸的是,我得到一个空白屏幕,没有任何类型的转换和日志消息告诉我我的 FlipTestViewController 中的 ViewDidDisappear 正在以某种方式被调用。可能是因为欢迎屏幕仍然存在。也许是内存管理问题?我应该把这个带到一个新的问题上吗?

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

4

3 回答 3

2

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

- (IBAction)playGameAction:(id)sender {
    FlipTestViewController *myViewController = [[FlipTestViewController alloc] initWithNibName:@"FlipTestViewController" bundle:nil];

    myViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:myViewController animated:YES completion:nil];
}

这会将 FlipTestViewController 置于具有翻转过渡样式的当前视图之上。

然后要关闭视图控制器,您可以将其连接到 FlipTestViewController 中的控件(通常是按钮):

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

这会关闭具有相同翻转动画的视图控制器

于 2012-08-17T19:57:45.057 回答
1

这听起来像实现你想要的最简单的方法就是重置应用程序窗口的 rootViewController 属性。从应用程序的任何位置,您都可以使用 [UIApplication sharedApplication].delegate.window.rootViewController 获取对根视图控制器的引用。因此,无论您使用何种操作方法切换到下一个视图控制器,您都可以分配初始化该控制器,然后将窗口的 rootViewController 属性设置为该控制器。如果您没有保留对控制器的其他引用,则应在重置属性时释放旧的引用(这可能是也可能不是您想要的 - 您可能想要一些属性来跟踪高分或在哪里例如,玩家正在玩游戏)。

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

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

所以我会在你的应用程序委托中放置类似的东西,以及你想在启动时显示的任何视图控制器。然后在您的视图控制器代码中(或者您将按钮放置在切换视图控制器的任何位置)中,您将有类似的东西(我在我的测试项目中使用了分段控件):

-(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;
    }
}
于 2012-08-18T15:44:35.200 回答
0

一种简单的方法是使用导航控制器。您可以获得推送/弹出的好处,这有助于屏幕序列。

然后,您可以使用以下命令弹出到特定控制器:

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

这使您可以转到已经呈现的特定视图控制器,而无需遍历所有其他视图控制器。

此外,鲜为人知的是,您可以将整个控制器堆栈替换为

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

它还用索引为零的控制器替换了基本控制器。

因此,您可以轻松获得顶部工具栏和所有导航控制器功能,当您只想将所有内容重置为某个控制器时,您只需...

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

编辑

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

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

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

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

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

您可以从根视图控制器调用它们。当您想更改控制器时,它将关闭当前控制器并呈现新控制器。

于 2012-08-17T23:08:41.093 回答