10

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

NavController -> VC1 -> VC2

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

我想在 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 也是如此。

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

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

怎么了?我的故事板有什么我搞砸的吗?请帮忙...

4

4 回答 4

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");
    }
}
于 2014-04-24T15:36:13.160 回答
6

viewWillDisappear如果 VC1 已消失,一个简单的解决方案是在将其设置为 YES 时添加一个标志。否则视图从未消失,因此它是第一次推送(RootViewControllerNavigation 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;
}
于 2014-04-24T15:35:23.983 回答
4

由于它似乎isMovingToParentViewController仅在将 viewController 推送到导航堆栈时设置,而不是为初始 rootViewController 设置,我建议使用以下内容:

 if([self.navigationController.viewControllers containsObject:self])
 {
     // being popped to self here
 }
 else
 {
     // being pushed here
 }
于 2014-04-24T15:33:06.320 回答
0

您必须在 VC2 的 viewWillDissapear 中检查 isMovingFromParentViewController 并调用在 VC1 中实现的委托方法。即 VC2 因为被弹出而被从其父导航控制器中移除。

于 2019-05-29T11:15:52.420 回答