导航控制器popViewControllerAnimated:yes未按预期工作

时间:2014-03-20 12:12:45

标签: ios uinavigationcontroller popviewcontrolleranimated

我正在使用以下代码行:

[self.navigationController popViewControllerAnimated:YES];

但它在ios 7中表现并不像在ios 6中那样表现。有些时候它不会弹出控制器而我们连续按下按钮2-3次。
导致导航栏中出现突然行为并取消分配控制器但在ui上显示相同的内容 因此,当我们按下该控制器上的任何内容时,由于控制器已被解除分配,因此导致崩溃。

7 个答案:

答案 0 :(得分:8)

检查您是否在UI线程上运行代码

答案 1 :(得分:6)

[self.navigationController popToRootViewControllerAnimated:YES];

此方法将导航到navigationController的根目录。

您可以使用以下代码检查viewController层次结构。

    NSLog(@"%@",self.navigationController.viewControllers);

答案 2 :(得分:4)

我用这种方式解决了这个问题:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                                                                     UINavigationController * nav = tabbarControl.selectedViewController;
                                                                     [nav.viewControllers objectAtIndex:0];
[nav setViewControllers:@[[nav.viewControllers objectAtIndex:0]] animated:NO];
                                                                tabbarControl.selectedIndex = 0;
 });

当您延迟一秒时,视图将从UI弹出,然后视图将从导航堆栈中弹出,我认为是动画序列的问题。

答案 3 :(得分:0)

尝试使用此代码从导航堆栈中弹出视图控制器

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];

答案 4 :(得分:0)

我在iOS 8上遇到了同样的问题。

我通过继承UINavigationController并添加以下代码解决了这个问题:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.delegate = self;
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
    return [super popViewControllerAnimated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}

我基本上阻止了流行动画中的所有用户交互。我知道这是一个肮脏的解决方案,但它是我发现的唯一解决问题的方法。

答案 5 :(得分:0)

我认为应该在没有dispatch_async的情况下工作。 我遇到了同样的问题,但是我知道了原因。

如果当前场景在情节提要中已分配给适当的视图控制器名称,则应检查它。(身份检查器->类)

如果将按钮操作连接到m文件,然后插入视图控制器的名称,则该名称无效。

因此,您应该删除连接,并插入正确的视图控制器名称,然后再将操作连接到m文件。

答案 6 :(得分:0)

我从主细节模板创建了我的项目,该模板使用拆分视图控制器。就我而言,删除拆分视图控制器可以解决此问题。