我可以在viewWillAppear中知道它是在navigationController pop(后退按钮)之后调用的吗?

ads*_*bum 24 objective-c viewwillappear ios

假设我有UIViewControllerA和B.用户使用push segue从A导航到B. 比用户按下后退按钮并来到A.

现在viewWillAppear称为A. 我可以在这里的代码中知道我来自后退按钮(navigationController popTo...)而不是通过其他方式吗?而且无需在B视图控制器中编写特殊代码.

fal*_*ypt 31

HM,也许你可以使用self.isMovingToParentViewControllerviewWillAppear,看文档,如果是NO,则意味着当前视图控制器已经是导航堆栈上.

  • 这个答案是不正确的.如果视图控制器位于弹出的控制器之下,则从`viewWillAppear`调用时,它的`isMovingToParentViewController`始终为`false`. (2认同)

G M*_*Man 10

我喜欢在视图控制器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;

    ....
}
Run Code Online (Sandbox Code Playgroud)

你正在做的是跟踪你的视图控制器(A)是否因为正在推动视图控制器(B)或其他原因而消失.然后(如果你没有修改子视图控制器命令)它应该准确地告诉你是否因为导航控制器上的弹出而出现(A).


Gav*_*vin 3

将 BOOL 属性添加到UIViewControllerA:

@property (nonatomic) BOOL alreadyAppeared;
Run Code Online (Sandbox Code Playgroud)

然后在您的viewWillAppear:方法中添加:

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

  • 但是,例如,也可以通过单击选项卡栏来显示视图控制器(它已经出现,但未通过后退按钮调用) (2认同)