我可以知道在viewWillAppear它被称为导航控制器popup后(后退button)?

假设我有UIViewController A和B.用户通过push segue从A导航到B. 比用户按下后退button来到A.

现在viewWillAppear的A被调用。 我可以知道在这里的代码,我来自后退button( navigationController popTo... )而不是另一种方式? 而且不用在B视图控制器中编写特殊的代码。

嗯,也许你可以在viewWillAppear使用self.isMovingToParentViewController ,看看文档 ,如果它是NO那么意味着当前的视图控制器已经在导航堆栈上。

我想在视图控制器A中执行以下操作:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (_popping) { _popping = false; NSLog(@"BECAUSE OF POPPING"); } else { NSLog(@"APPEARING ANOTHER WAY"); } //keep stack size updated _stackSize = self.navigationController.viewControllers.count; .... } - (void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; _popping = self.navigationController.viewControllers.count > _stackSize; .... } 

你正在做的是跟踪你的视图控制器(A)是否正在消失,因为视图控制器(B)正在被推动或由于其他原因。 然后(如果您没有修改子视图控制器的顺序),它应该准确地告诉您是否(A)由于导航控制器上的popup而出现。

添加一个BOOL属性到UIViewController A:

 @property (nonatomic) BOOL alreadyAppeared; 

然后在你的viewWillAppear:方法中,添加:

 if (!self.alreadyAppeared) { self.alreadyAppeared = YES; // Do here the stuff you wanted to do on first appear }