popToRootViewControllerAnimated使我的应用程序崩溃

时间:2014-09-25 08:37:07

标签: ios objective-c uiviewcontroller ios8

我的应用包含一些UIViewControllers。第一个是登录页面,第二个是"菜单页面"和第三个viewController

我在每个页面上的按钮上放置了一个注销功能,其中包含一个alertView:

- (IBAction)logout:(id)sender {
    UIAlertView *logoutConfirm = [[UIAlertView alloc] initWithTitle: @"Logout" message: @"Sure ? " delegate: self cancelButtonTitle: @"Ok" otherButtonTitles:@"Cancel", nil];

    [logoutConfirm show];
}

// Logout 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // Logs to track the bug
    NSLog(@"LOG :%@", [self.navigationController viewControllers]);
    NSLog(@" LOG 2 : %@", [self.navigationController.viewControllers objectAtIndex:0]);

    if (buttonIndex == 0) {
        [self.navigationController popToRootViewControllerAnimated:NO];
    }
}

使用此消息,popToRootViewControllerAnimated会使应用程序在第三个ViewController上崩溃而不是第二个:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'adding a root view controller <MainViewController: 0xXXXXXX> as a child of view controller:<UINavigationController: 0xXXXXXX>'

有我的日志:

2014-09-25 10:24:35.074 Poject[18594:654203] LOG :(
    "<MainViewController: 0xXXXXXXX>",
    "<secondViewController: 0xXXXXXXX>",
    "<thirdViewController: 0xXXXXXXX>"
)
2014-09-25 10:24:35.075 Poject[18594:654203]  LOG 2 : <MainViewController: 0xXXXXXXX>

似乎我添加了一个UIViewController,但只是想回到第一个viewController ...我觉得如果它在第二个ViewController上工作却很奇怪但是没有第三个......

更新

@mehul patel告诉我在我的AppDelegate.h中评论这一行:

[self.window addSubview:self.navigationController.view];

因为:

  

您无法将rootViewController作为子视图添加到窗口,它将以任何方式崩溃

但是现在,pushViewController在&#34;登录按钮&#34;在我的firstViewController中不再工作了。它什么都不做,所以我NSLog我的navigationController的控制器数组

我第一次得到:

2014-09-25 16:48:07.512 Project[22023:780717] (
    "<MainViewController: 0xf81f290>"
) 

我第二次得到:

2014-09-25 16:48:12.104 Project[22023:780717] (
    "<MainViewController: 0xf81f290>",
    "<MenuSelectionViewController: 0xd929030>"
) 

但是,观点并没有改变......

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

试试这个

- (void) logout {

    @try {
        NSArray *controllers = [self.navigationController viewControllers];

        if (controllers && [controllers count] > 0) {
            UIViewController *loginController = [controllers objectAtIndex:0];
            [self.navigationController popToViewController:loginController animated:YES];
        }
    }
    @catch (NSException *exception) {
            // Throws an exception
    }
}

答案 1 :(得分:0)

我们在AppDelegate:didFinishLaunchingWithOptions

中有相当旧的代码
self.window.rootViewController = self.rootViewController;
[self.window addSubview:self.navigationController.view];

必须删除这两行,我们补充说:

self.window.rootViewController = navigationController;

这解决了这个问题,适用于iOS7和iOS8。