在viewControllers之间切换

时间:2011-10-25 05:02:39

标签: iphone uiviewcontroller

我已经在应用程序商店上出售的几个应用程序中使用了这种方法,但出于某种原因,我正在处理的当前应用程序让我疯狂......我必须忽略一些东西。

该应用的主要viewController .h文件:

#import "MainMenuController.h"
#import "GamePlay.h"

@interface ProjectNameiPhoneViewController : UIViewController <MenuDelegate, GameDelegate> {
      UIViewController *currentPageController;
}

该应用启动并加载MainMenu viewController:

UIViewController *nextController = [[MainMenuController alloc] initWithNibName:@"MainMenuController" bundle:nil];
[nextController performSelector:@selector(setDelegate:) withObject:self];

[self.view addSubview:nextController.view];

currentPageController = nextController;
[currentPageController retain];
[nextController release];

来自MainMenuController.m,用户选择开始游戏:

[delegate startGameplay:self];

返回应用程序的主viewController:

- (void)startGameplay:(MainMenuController *)sender {

    UIViewController *nextController = [[GamePlay alloc] initWithNibName:@"GamePlay" bundle:nil];

    [nextController performSelector:@selector(setDelegate:) withObject:self];

    [currentPageController.view removeFromSuperview];
    [self.view addSubview:nextController.view];

    [currentPageController release];
    currentPageController = nextController;
    [currentPageController retain];
    [nextController release];
}

在游戏界面中,用户点击后退按钮返回主菜单:

- (IBAction)backTapped {
    [delegate backToMenu:self];
}

返回应用程序的主viewController:

- (void)backToMenu:(GamePlay *)sender {

    UIViewController *nextController = [[MainMenuController alloc] initWithNibName:@"MainMenuController" bundle:nil];

    [nextController performSelector:@selector(setDelegate:) withObject:self];

    [currentPageController.view removeFromSuperview];
        [self.view addSubview:nextController.view];

    [currentPageController release];
    currentPageController = nextController;
    [currentPageController retain];
    [nextController release];   
}

我再次选择从主菜单开始游戏。

GamePlay类/ Nib加载,我再次单击后退按钮返回主菜单。

此时应用程序崩溃,没有信息打印到控制台。

任何想法都会非常受欢迎 - 我已经在我的代码中注释了几乎所有其他内容,以至于viewControllers之间的这种切换实际上是唯一运行的代码,我不知道为什么它会崩溃。 ..

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可能希望将MainMenuController作为应用程序keyWindow的rootViewController。

此外,不应将UIViewController的视图添加到其他UIViewController的视图中,因为这会破坏响应者链,而在iOS 5.0中,将抛出异常。如果您选择仅将其实现为iOS 5.0应用程序,那么我建议您查看[UIViewController -addChildViewController:][UIViewController -removeChildViewController:]

在说这个时,如果可行,更好的解决方案是将MainMenuController作为rootViewController,如上所述,然后在[UIViewController -presentModalViewController:animated:]方法中调用startGameplay并使用委托来解除模态视图控制器

答案 1 :(得分:0)

这似乎不是一个真正的解决方案,但是当我通过Xcode的“构建和运行”运行时,应用程序才会崩溃。如果我通过单击设备本身上的图标打开应用程序,该应用程序运行完美。我可以长时间播放它并将按钮混合以在一次又一次地反复切换视图控制器,并且它不会崩溃。所以我打算将它提交给App Store,即使它在Xcode运行时每次都没有错误信息也会崩溃 - 它绝对不会在设备本身崩溃。

通过Xcode运行时崩溃最奇怪的部分是: 应用程序在设备上崩溃,退出到主屏幕。但是,Xcode仍然将应用程序显示为“正在运行”,我可以选择单击“停止” - 它不会显示为灰色。正如我所说,没有错误信息打印到控制台。