Obj-C-取消所有推送的视图控制器会导致崩溃吗?

时间:2019-05-10 16:51:35

标签: ios objective-c

当我的用户点击一个按钮时,我想返回到我的推栈中的第一个视图控制器。我已经记录了堆栈,并返回以下内容:

[4352:924095] HERE IT IS (
    "<MapViewController: 0x10c014800>",
    "<MUAQuestionViewController: 0x10674b4f0>",
    "<MUAQuestionViewController: 0x10953e730>",
    "<MUAQuestionViewController: 0x10674e4b0>",
    "<MUAQuestionViewController: 0x1067502f0>",
    "<MUAQuestionViewController: 0x10949e5e0>",
    "<MUAQuestionViewController: 0x109549b90>"
)

当我的用户点击我的“关闭”按钮时,我只是希望将它们返回给MapViewController。就是说,当我的用户点击“关闭”时,会发生以下崩溃:

  

*由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'* -[NSDictionary   initWithObjects:forKeys:]:对象数(0)与对象数不同   键(1)'

这是我的代码:

- (IBAction)closeFinal:(id)sender {

    NSArray *array = [self.navigationController viewControllers];

    NSLog(@"HERE IT IS %@", array);

    [self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];

    }

为什么会这样?

2 个答案:

答案 0 :(得分:0)

您应该使用popToRootViewControllerAnimated:方法关闭所有推送的视图控制器

  

弹出除根视图以外的所有视图控制器   控制器并更新显示。

[self.navigationController popToRootViewControllerAnimated:YES];

答案 1 :(得分:0)

不要保留导航控制器的viewControllers;它是易变的(即,它将在您的背后突变)。只需获取所需的视图控制器即可。这是一个安全的版本:

UINavigationController* nav = self.navigationController;
if (nil != nav && nav.viewControllers.count > 0) {
    UIViewController* vc = [nav.viewControllers objectAtIndex:0];
    [nav popToViewController:vc animated:YES];
}