iOS:isMovingToParentViewController未按预期工作

时间:2014-04-24 15:10:42

标签: ios uinavigationcontroller pushviewcontroller popviewcontroller

我的设置很简单,我的问题与this one没有什么不同。但是为了更好地解释它,我在这里发布了它:

NavController -> VC1 -> VC2

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

我想在VC1中检测是否:

它直接作为根视图控制器出现(通过Push) 它出现了VC2弹出的结果

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

isMovingToParentViewController == NO 

然而事实并非如此,并且上述情况总是证明是正确的。 这意味着,(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
    }    
}

viewDidAppear也是如此。

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

([self isMovingFromParentViewController])
([self isMovingToParentViewController])
([self isBeingPresented])
([self isBeingDismissed])

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

4 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:4)

一个简单的解决方案是在viewWillDisappear上添加一个标志,如果VC1已经消失,则将其设置为YES。否则视图从未消失,因此它是第一次推动(RootViewController的{​​{1}})。

示例代码

Navigation Controller

答案 2 :(得分:3)

由于看起来isMovingToParentViewController仅在将viewController推送到导航堆栈时设置,而未设置为初始rootViewController,我建议使用以下内容:

 if([self.navigationController.viewControllers containsObject:self])
 {
     // being popped to self here
 }
 else
 {
     // being pushed here
 }

答案 3 :(得分:0)

您必须在VC2的viewWillDissapear中检查isMovingFromParentViewController并调用在VC1中实现的委托方法。即由于被弹出,VC2已从其父导航控制器中删除。