self.navigationController pushViewController不将控制器添加到堆栈中



我在一个名为VCA的ViewController上,我这样做:

[self.navigationController pushViewController:vcB animated:YES];

它有效。VCB被推。在VCB的ViewDidAppear中,我这样做:

NSArray *controllers = self.navigationController.viewControllers;

,控制器只包含一个对象,VCA !!!!(什么?)

为什么将VCB添加到控制器数组中?有什么可以阻止这种情况发生的吗?

谢谢。

我将头撞在墙上一个星期,以解决此问题,涉及在导航控制器堆栈上推动视图控制器。

问题是:我在基于导航控制的应用程序上,我有3个视图控制器VA,VB和VC。

我使用以下方式从VA推出VB:

[self.navigationController pushViewController:vB animated:YES];

它有效,但是,当我尝试从VB推动VC时,VB的self.navigationController属性为nil,VB不在导航控制器堆栈上。什么?是的,我在导航堆栈上推了VB,并没有添加VB,但即使如此,VB也正确显示。

我发现,在VB的ViewDidload中,Self.NavigationController并非零,并且VB在导航控制器堆栈上,但是一旦VB的ViewDidload结束,VB就会从Navigation Controler堆栈中删除VB,并将其NILROLLER属性设置为Nilil and nilil and nilil and nil niler属性。当时,VB是一种幽灵控制,在导航控制器堆栈之外。

我不需要提及VB,我无法回到VA或推动VC。

这是怎么发生的?

简单,我从一个块内推动VB ...类似:

void (^ block1)() = ^(){
   [self.navigationController pushViewController:vB animated:YES];
};

发生了什么,因为Uikit函数(推动事物)是在可能不是主线程的线程上运行的块中执行的。

使用以下方式将其包裹在派遣到主线程中的分辨率:

void (^ block1)() = ^(){
dispatch_async(dispatch_get_main_queue(),
               ^{
                   [self.navigationController pushViewController:vB animated:YES];
               });
};  

该应用程序还有另一个小问题,与ViewController连接的错误插座,但这是主要问题。这是很难发现的问题,因为很微妙。当我在导航栏中添加另一个按钮时,我发现了问题,并且该按钮没有显示。因此,我怀疑在这种情况下正在发生涉及Uikit的事情,或者没有发生。这里的最大问题是,此代码没有崩溃,没有错误消息,什么都没有,只是工作不好,而是工作。

我相信这与您的检查时间有关。在pushViewController方法中,下一个视图控制器的ViewWillAppear:方法(以及其他您正在检查的方法)正在被调用。我相信在所有这些方法都被调用后,动画完成后,在导航堆栈上考虑了视图控制器。

最新更新