Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:isMovingToParentViewController未按预期工作_Ios_Uinavigationcontroller_Pushviewcontroller_Popviewcontroller - Fatal编程技术网

iOS:isMovingToParentViewController未按预期工作

iOS:isMovingToParentViewController未按预期工作,ios,uinavigationcontroller,pushviewcontroller,popviewcontroller,Ios,Uinavigationcontroller,Pushviewcontroller,Popviewcontroller,我的设置很简单,我的问题与其他问题没有太大区别。不过,为了更好地解释,我将其发布在这里: NavController -> VC1 -> VC2 VC1是NavController的根视图控制器。 可通过VC1的推送序列访问VC2 我想在VC1内检测是否: 它直接显示为根视图控制器(通过推送) 这似乎是VC2被弹出的结果 我读了一些文件,上面说下面应该告诉我以后的情况是否属实 isMovingToParentViewController == NO 然而事实并非如此,上述条件总

我的设置很简单,我的问题与其他问题没有太大区别。不过,为了更好地解释,我将其发布在这里:

NavController -> VC1 -> VC2
VC1是NavController的根视图控制器。 可通过VC1的推送序列访问VC2

我想在VC1内检测是否:

它直接显示为根视图控制器(通过推送) 这似乎是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])
发生了什么事? 我的故事板上有什么搞错的吗?
请帮助…

因为似乎只有当viewController被推送到导航堆栈时才会设置
isMovingToParentViewController
,而不是为初始rootViewController设置,我建议使用以下方法:

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

一个简单的解决方案是,如果VC1已消失,则在
视图上添加一个标志将消失
将其设置为“是”。否则视图从未消失,因此它是第一次推送(
导航控制器的
RootViewController

示例代码


不幸的是,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");
    }
}

您必须在VC2的ViewWillDisapear中检查isMovingFromParentViewController,并调用VC1中实现的委托方法。也就是说,VC2由于弹出而从其父导航控制器中删除。

如果将预期调用添加到
[超级视图将显示:动画]
视图的开头将出现:
方法?我确实在
视图的开头包含了这一行,但是没有结果。当
VC2
弹出时,这四种方法都应该在
VC1
中返回
no
。但是我希望
isMovingToParentViewController
在第一次显示
VC1
时返回
YES
。我一直在视图中这样做的是使用
[self.navigationController.viewControllers containsObject:self]
如果按下self,则为false,如果我们跳回self,则为真。一些实验表明,只有当viewController被推送到导航堆栈时,isMovingToParentViewController才为真。它不是为rootViewController设置的。但是当
self
是根控制器并且它是第一次显示时,
if
不是真的吗?看起来你是对的@rmaddy。我想我以前从未在rootViewController中使用过…@rmaddy是对的<代码>如果([self.navigationController.viewControllers containsObject:self])
总是正确的。回头看,我实际上是用它来触发
视图中的完成块将消失:
而不是
视图将出现:
我只是键入了一个非常类似的答案。早在添加
isMovingToParentViewController
方法之前,我就一直在这样做了。这是最简单的方法,我要编写的另一个方法是@rdelmar for viewDidLoad,但我刚刚想到了这个主意。
UINavigationControllerDelegate
能帮忙吗?这种方法非常简单,但不一定能解决Push-Pop问题。令人惊讶的是,我们有这么多的方法,但没有一个有用!我不太明白@NiravBhatt,这里的想法是当VC1消失时,它被推到了VC2。在view中,当hasEnglishe=YES时将出现VC2。我的意思是,在根视图控制器的情况下,此解决方案并不完全解决推送/弹出事件。无论如何,这是不可避免的,考虑到我在@rdelmar的答案上标记的时间戳+1以获取帮助。在还原层次结构时,状态还原失败,因为第一次加载根VCs视图是在返回时。
@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");
    }
}