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 具体而言,我建议您设置NSZombieEnabledMallocStackLogging 环境变量并检查究竟是什么失败了。 我会试试看会发生什么,谢谢你的建议! 【参考方案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 动画

Swift - 解雇后的popViewController

popViewController(animated: true) 动画运行缓慢

为啥 ARC 在 popViewController 之后不释放内存

NSURLSessionDataTask 中的 popViewController 动画工作缓慢

dismissModalViewController 然后是 popViewController