假设我有UIViewController
A 和 B。
用户通过 push segue 从 A 跳转到 B。
然后,用户按下返回按钮并回到A。
现在调用A的viewWillAppear
。 在这里,我能否知道我是通过返回按钮(navigationController popTo...
)而不是其他方式进入的?而且不需要在B视图控制器中编写特殊代码。
假设我有UIViewController
A 和 B。
用户通过 push segue 从 A 跳转到 B。
然后,用户按下返回按钮并回到A。
现在调用A的viewWillAppear
。 在这里,我能否知道我是通过返回按钮(navigationController popTo...
)而不是其他方式进入的?而且不需要在B视图控制器中编写特殊代码。
嗯,也许你可以在viewWillAppear
中使用self.isMovingToParentViewController
,请参考文档。如果它的值为NO
,那么它就意味着当前视图控制器已经位于导航堆栈上。
if (self.isMovingToParentViewController)
{
// 仅在第一次移动到父视图控制器时执行某些操作,而不是在返回按钮上执行
}
- PhamerviewWillAppear
调用时,它的 isMovingToParentViewController
总是为 false
。 - Eric我喜欢在视图控制器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)由于导航控制器上的弹出而出现。
在UIViewController
A中添加一个BOOL属性:
@property (nonatomic) BOOL alreadyAppeared;
然后在您的 viewWillAppear:
方法中添加以下内容:
if (!self.alreadyAppeared) {
self.alreadyAppeared = YES;
// Do here the stuff you wanted to do on first appear
}
viewWillAppear
)。添加这个布尔值就可以解决了。 - Paul Razvan Berg