popViewController Animated 不工作,但后退按钮工作
Posted
技术标签:
【中文标题】popViewController Animated 不工作,但后退按钮工作【英文标题】:popViewControllerAnimated not working, but back button works 【发布时间】:2010-05-03 12:52:59 【问题描述】:我正在创建一个基于实用程序模板的应用程序。主屏幕由一个带有多个按钮的菜单组成,每个按钮创建一个不同的翻转视图。在其中一个翻转视图中,我还配置了一个导航控制器,只要我激活了 NavigationBar,它就可以完美地工作......我可以推送视图,但我必须使用“后退”按钮返回到我的翻转 -侧视图,这将是导航控制器的根。如果我尝试使用正确配置了按钮的“popViewControllerAnimated”而不是 NavigationBar 的“返回”按钮返回,就会出现问题。我的应用程序由于某种原因崩溃了,我不明白为什么。
我可以只使用 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];
我不知道这一切是否有意义,我目前正在开始我的第一个应用程序,并且由于传统的试错法,我仍在学习。不过,我看不出这个问题的原因,如果能得到任何帮助,我将不胜感激。
非常感谢,
手动
【问题讨论】:
调试内存问题我发现以下文章非常有用:cocoadev.com/index.pl?DebuggingAutorelease 具体而言,我建议您设置NSZombieEnabled
和MallocStackLogging
环境变量并检查究竟是什么失败了。
我会试试看会发生什么,谢谢你的建议!
【参考方案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),我返回第一个视图的方法无法正常工作。
这可能是一个非常基本的问题,但我花了几个小时才意识到这个问题,我很高兴我能自己找到它,只需遵循我的代码并使用一点常识。
【讨论】:
【参考方案2】:当询问崩溃时,显示您收到的消息是一个非常好的主意。
虽然“self.delegate”行让我怀疑,但您显示的代码没有任何明显错误。您应该检查该属性是如何声明的,以及是否要双重释放它。
【讨论】:
非常感谢您的回复!我绝对需要检查那个代表;我的应用程序基于 Xcode 中包含的实用程序之一,因此我使用相同的结构并且没有更改与委托相关的任何内容。无论如何,它一定与它有关,因为我已经能够在不使用委托时使其他应用程序与 popViewControllerAnimated 一起使用。我收到的消息(希望这就是您的意思)是:*** 由于未捕获的异常 zNSInvalidArgumentException 导致应用程序终止,原因:'*** -[UIViewController backFromFuelUplift2View]:无法识别的选择器已发送到实例 0x3917440' 我对这一切的一个疑问是:如果我按下 NavigationBar 中的“返回”按钮,为什么它可以完美地工作,但如果我使用 popViewControllerAnimated 创建自己的方法则不能?他们不应该做同样的事情吗? 错误信息告诉你一切。您正在向错误的对象发送返回消息。 谢谢保罗,我刚刚在这里看到你的消息。我已经意识到问题出在哪里(现在我觉得有点愚蠢)......事实上,我将消息发送到了错误的对象。感谢您的帮助!以上是关于popViewController Animated 不工作,但后退按钮工作的主要内容,如果未能解决你的问题,请参考以下文章
popViewController 和 pushViewController 动画
popViewController(animated: true) 动画运行缓慢
为啥 ARC 在 popViewController 之后不释放内存