iOS:isMovingToParentViewController未按预期工作

Nir*_*att 9 uinavigationcontroller popviewcontroller pushviewcontroller ios

我的设置很简单,我的问题不是来自非常不同的这一个.但是为了更好地解释它我在这里发布:

NavController -> VC1 -> VC2
Run Code Online (Sandbox Code Playgroud)

VC1是NavController的根视图控制器.VC2可通过VC1的Push segue访问.

我想在VC1中检测是否:

它直接作为根视图控制器出现(通过Push)它是由于VC2被弹出而出现的

我阅读的文档说下面应该告诉我以后是否属实.

isMovingToParentViewController == NO 
Run Code Online (Sandbox Code Playgroud)

然而事实并非如此,并且上述情况总是证明是正确的.这意味着,(self.isMovingToParentViewController == NO)总是在发生.

这是我的代码:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = YES;

    //pushed to stack
    if (self.isMovingToParentViewController == YES)
    {
        //First time
      }
    else
    //popped off
    {
        //via Pop from VC2
    }    
}
Run Code Online (Sandbox Code Playgroud)

viewDidAppear的情况也是如此.

事实上检查,我在开始时放置断点,并在两种情况下检查以下所有都是FALSE:

([self isMovingFromParentViewController])
([self isMovingToParentViewController])
([self isBeingPresented])
([self isBeingDismissed])
Run Code Online (Sandbox Code Playgroud)

怎么了?我的故事板里有什么东西可以搞定吗?请帮忙...

rde*_*mar 14

不幸的是,isMovingToParentViewController不适用于根视图控制器,所以我通常用BOOL处理这种情况,

@implementation ViewController {
    BOOL isFirstAppearance;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    isFirstAppearance = YES;
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (isFirstAppearance) {
        NSLog(@"root view controller is moving to parent");
        isFirstAppearance = NO;
    }else{
        NSLog(@"root view controller, not moving to parent");
    }
}
Run Code Online (Sandbox Code Playgroud)


E-R*_*die 5

一个简单的解决方案是添加一个标志,viewWillDisappear如果 VC1 已消失,则将其设置为 YES。否则视图从未消失,所以它是第一次推送(RootViewControllerof Navigation Controller)。

示例代码

BOOL hasDisappeared;

-(void)viewWillAppear:(BOOL)animated
{
    if (hasDisappeared==YES) {
        //VC2 has been popped
    }
    else
    {
        //VC1 is the rootViewController
    }
}

-(void)viewWillDisappear:(BOOL)animated
{
    //Pushing to VC2
    hasDisappeared=YES;
}
Run Code Online (Sandbox Code Playgroud)