2010-05-03 148 views
0

我正在创建一个基于Utility模板的应用程序。主屏幕由一个带有几个按钮的菜单组成,每个按钮创建一个不同的翻转视图。在其中一个翻转视图中,我还配置了一个导航控制器,只要我激活了NavigationBar,它就可以完美工作......我可以推动视图,但必须使用“后退”按钮返回到我的翻转屏幕,侧视图,这将是导航控制器的根。如果我尝试返回使用“popViewControllerAnimated”,正确配置按钮,而不是NavigationBar的“后退”按钮,问题就出现了。我的应用程序因某种原因崩溃,我无法理解为什么。popViewControllerAnimated不能正常工作,但后退按钮能正常工作

我可以使用NavigationBar中的“后退”按钮并忘记问题,但我更愿意拥有自己的按钮以便返回。

我的应用程序包括以下内容:

我APPDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    MenuViewController *menuController = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:nil]; 
    self.menuViewController = menuController; 
    [menuController release]; 

    menuViewController.view.frame = [UIScreen mainScreen].applicationFrame; 
    [window addSubview:[menuViewController view]]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

MenuViewController.m开始我的翻盖侧视图:

- (IBAction)showFuelUpliftView {  

    FuelUpliftViewController *controller = [[FuelUpliftViewController alloc] 
              initWithNibName:@"FuelUpliftView" bundle:nil]; 
    controller.delegate = self; 
    controller.title = @"Fuel Uplift"; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 
    [navController setNavigationBarHidden: NO]; 
    navController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:navController animated:YES]; 

    [navController release]; 
    [controller release]; 
} 

FuelUpliftViewController.m,我在那里用按钮推动NavigationController的第二个视图:

- (IBAction)showFuelUplift2View:(id)sender { 
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 
    controller.title = @"Settings"; 
    [self.navigationController pushViewController:controller animated:YES]; 
    [controller release]; 
} 

最后,我FuelUplift2ViewController.m,在试图返回时,应用程序崩溃:

- (IBAction)backFromFuelUplift2View { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

我不知道这一切是有道理的,我目前正在与我的第一个应用开始,现在还在学习感谢传统的试用错误方法。不过,我看不出这个问题的原因,并希望得到任何帮助。

非常感谢,

马努

+1

调试内存问题我发现下面的文章非常有用:http://www.cocoadev.com/index.pl?DebuggingAutorelease特别是我建议你设置NSZombieEnabled和MallocStackLogging环境变量,并检查究竟是什么失败。 – SergGr 2010-05-03 13:09:35

+0

我会尝试一下,看看会发生什么,感谢您的建议! – Manu 2010-05-03 17:26:04

回答

1

我终于能够解决我的问题。

为了创造在我的UINavigationController第二种观点,我有这样的:

- (IBAction)showFuelUplift2View:(id)sender { 
    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 
    controller.title = @"Settings"; 
    [self.navigationController pushViewController:controller animated:YES]; 
    [controller release]; 
} 

我把这些代码从另一个论坛,它的工作马上,所以我无法想象,我要有问题。通过上面的代码,如果我理解正确,我为我的第二个视图创建一个新的UIViewController,这就是为什么我能够切换到第二个视图并有一个工作的“后退”按钮。

总之,为了配置自己的按钮返回,我应该写如下:

FuelUplift2ViewController *controller = [[FuelUplift2ViewController alloc] initWithNibName:@"FuelUplift2View" bundle:nil]; 

显然我不能正确初始化一个随机的UIViewController,但我并没有指明正确的哪一个是(FuelUplift2ViewController),我的方法返回到第一个视图无法正常工作。

这可能是一个非常基本的问题,但花了我几个小时才明白这个问题,我很高兴能够自己找到它,紧跟着我的代码并使用一点常识。

0

当问崩溃,它是显示你得到的消息,一个非常好的主意。

您显示的代码中没有任何明显的错误,虽然“self.delegate”行让我感到可疑。你应该检查财产是如何声明的,如果你是双重释放它。

+0

非常感谢您的回复! 我绝对需要检查该代表;我的应用程序基于Xcode中包含的实用程序,因此我使用相同的结构,并且没有更改任何与代表有关的内容。无论如何,它必须与它有关,因为当不使用委托时,我可以使其他应用程序与popViewControllerAnimated协同工作。 我得到的消息是: ***终止应用程序由于未捕获的异常zNSInvalidArgumentException',原因:'*** - [UIViewController backFromFuelUplift2View]:无法识别的选择器发送到实例0x3917440' – Manu 2010-05-03 17:22:51

+0

我对这一切有个疑问:为什么如果我按下导航栏中的“返回”按钮,但是如果我使用popViewControllerAnimated创建了我自己的方法,它会如何工作?他们不应该完全一样吗? – Manu 2010-05-03 17:35:04

+0

错误消息告诉你所有。您正在将错误消息发送给错误的对象。 – 2010-05-03 19:36:41