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");
}
}