【问题标题】:Navigation controller popViewControllerAnimated : yes is not working as expected导航控制器 popViewControllerAnimated :是的没有按预期工作
【发布时间】:2014-03-20 12:12:44
【问题描述】:

我正在使用以下代码行:

[self.navigationController popViewControllerAnimated:YES];

但它在 ios 7 中的行为不像在 ios 6 中那样。有时它不会在我们连续按下返回按钮 2-3 次时弹出控制器。
导致导航栏中的突然行为并释放控制器,但在 ui 上显示相同。
因此,当我们在该控制器上按下任何东西时,都会导致崩溃,因为控制器已经被释放。

【问题讨论】:

  • 我很高兴我不是唯一发生这种情况的人。 iOS 7+ 错误(在 iOS 8 中也有)。该视图是从导航堆栈中弹出的,但不是从 UI 动画。然后它就卡在那里了,因为它不再是堆栈的一部分!

标签: ios uinavigationcontroller popviewcontrolleranimated


【解决方案1】:

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

【讨论】:

  • dispatch_async(dispatch_get_main_queue(), ^{ [(UINavigationController *)tabBarController.selectedViewController popToRootViewControllerAnimated:NO]; });为我解决了类似的问题
【解决方案2】:
[self.navigationController popToRootViewControllerAnimated:YES];

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

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

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

【讨论】:

  • 使用 NSLog 检查您的 navigationController 层次结构。
  • 使用 popToRootViewControllerAnimated 方法
  • @SidShah,popToRootViewController会回到navigationStack的根,但是如果你想连续2-1-0回来怎么办
【解决方案3】:

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

 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 中弹出,然后视图会从导航堆栈中弹出,我认为是动画序列的问题。

【讨论】:

    【解决方案4】:

    试试这个代码从导航堆栈中弹出一个视图控制器

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

    【讨论】:

    • 你能解释一下你的答案吗?
    【解决方案5】:

    我在 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];
    }
    

    我基本上会在弹出动画期间阻止所有用户交互。我知道这是一个肮脏的解决方案,但它是我发现的唯一解决问题的方法。

    【讨论】:

      【解决方案6】:

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

      如果当前场景被分配给故事板中正确的视图控制器名称,我们应该检查它。(身份检查器 -> 类)

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-23
          • 2020-10-25
          • 2018-12-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多