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

我在一个名为vcA的viewController,我这样做:

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

它的工作。 vcB被推送。 里面的vcB的viewDidAppear我这样做:

 NSArray *controllers = self.navigationController.viewControllers; 

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

为什么将vcB添加到控制器arrays? 有什么可以防止发生?

谢谢。

为了解决导航控制器堆栈上的视图控制器问题,我把头撞在墙上一个星期。

问题是这样的:我在一个导航控制的应用程序,我有3个视图控制器,vA,vB和vC。

我正在使用vA从vA推动vB:

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

它的工作,但是,当我试图从vB推vC,vB的self.navigationController属性为零,vB不在导航控制器堆栈上。 什么? 是的,我在导航栈上推vB,vB没有被添加到它,但即使如此,vB显示正确。

我发现在vB的viewDidLoad中,self.navigationController不是零,而vB是在导航控制器堆栈上,但一旦vB的viewDidLoad结束,vB已从导航控制器堆栈中移除,并且其navigationController属性被设置为零。 那时候,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]; }); }; 

该应用程序有一个错误的sockets连接到viewController的另一个小问题,但这是主要的问题。 这是难以发现的问题,因为它是微妙的。 当我向导航栏添加另一个button时,我发现了这个问题,并且该button没有出现。 所以,我怀疑涉及UIKit的事情正在发生,或者没有发生在这种情况下。 这里的大问题是,这个代码没有崩溃,没有错误信息,没有,只是工作不好,但工作。

我相信这与你的检查时间有关。 在pushViewController方法中,下一个视图控制器的viewWillAppear:方法(以及其他方法,比如你正在检查的方法)正在被调用。 我相信在所有这些方法被调用之后,在animation完成之后,视图控制器被认为在导航栈上。