我使用以下代码行:
[self.navigationController popViewControllerAnimated:YES];
但它在ios 7中的行为与ios 6中的行为不同。有时,当我们连续按2- 3次后退键时,它不会弹出控制器。
导致导航栏中的突然行为和释放控制器,但在ui上显示相同。因此,当我们按下控制器上的任何东西时,它会导致崩溃,因为控制器已经被释放了
检查你是否在UI线程上运行代码
[self.navigationController popToRootViewControllerAnimated:YES];
这个方法将导航到你的navigationController的根目录。
你可以用下面的代码检查你的viewController层次结构。
NSLog(@"%@",self.navigationController.viewControllers);
我用这种方法解决了这个问题:
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弹出,然后视图会从导航堆栈弹出,我认为这是动画序列的问题
我在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];
}
在弹出动画期间,我基本上阻止了所有用户交互。我知道这是一个肮脏的解决方案,但这是我发现的唯一解决问题的方法。
我认为应该没有dispatch_async工作。我遇到了同样的问题,但是我想知道原因。
我们应该检查当前场景是否在故事板中被分配给了一个合适的视图控制器名称。(标识检查器->类)
如果你将一个按钮动作连接到一个文件,然后插入视图控制器的名称,这是不工作的
你应该删除连接,然后插入适当的视图控制器名称,然后你应该再次将动作连接到m文件。
我从master-detail模板创建了我的项目,它使用分屏视图控制器。在我的例子中,删除分屏视图控制器解决了这个问题。
对popViewController(animated:)
, popToRootViewController(animated:)
和相关调用的调用在主队列中进行是很重要的,但在某些情况下,这似乎不够好,并且动画不会发生
我能够像这里的其他一些答案中描述的那样修复它,稍后在主队列中执行弹出导航。Swift版本:
DispatchQueue.main.async {
self.rootViewController.popViewController(animated: true)
}
这可能是由于其他动画仍在进行中,并且通过以这种方式调度块,它发生在当前工作的末尾或当前在主队列中调度的块,这允许动画正确执行。
试试下面的代码从导航堆栈中弹出一个视图控制器
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];