我在导航控制器(NAV1)中嵌入了视图控制器(VC1)。在它的viewWillAppear方法中,我进行了一个调用,以模态的方式呈现另一个视图控制器。在一种情况下,我需要用动画表示新的视图控制器(VC2),而在另一种情况下,它应该不带动画地表示。VC2还嵌入到它自己的导航控制器(NAV2)中。
当动画标志设置为TRUE时,一切正常。当我将标志设置为FALSE时,出现了一些错误: 1.我在控制台中收到以下警告:不鼓励在分离的视图控制器上呈现视图控制器2.当我在调用dismissViewControllerAnimated:FALSE completion:nil之后从VC2移回时,未调用VC1的viewWillAppear方法。如果动画标志设置为TRUE,它将被调用。
在VC1中:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self performSelector:@selector(importStuff:)
withObject:nil];
}
-(void)importStuff
{
//instatntiate VC2
//instantiate NAV2
[Utility presentViewController:pNavController
fromViewController:self
animated:FALSE
completion:nil];
// the above method calls the presentViewController:animated:completion: method
} 在VC2中:
[Utility dismissViewController:self
animated:FALSE
completion:nil];上面的方法调用dismissViewControllerAnimated:方法。
发布于 2015-12-18 16:05:57
这不是一种解决方案,而是一种解决方法:
通过使用afterDelay:0,您可以轻松地将任何UI操作推迟到下一个事件循环
[self performSelector:@selector(importStuff:)
withObject:nil
afterDelay:0];这将使当前操作有机会完成。
此外,0.4的延迟将与操作系统匹配。然而,无论你使用什么延迟(不是0)都是一个杂乱无章的东西,不能保证在任何情况下都能工作,设备和内存负载等等。
相反,你应该重新审视你的方法。
更改您的设计:
不要一开始就冒着遇到这场动画竞赛的风险。您有几个选项,包括:
自己控制过渡动画并等待其完成,然后再推送另一个视图控制器(使用完成信号或完成block)
发布于 2015-12-18 16:06:23
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self performSelector:@selector(importStuff) withObject:nil afterDelay:0.1];
}
-(void)importStuff
{
//instatntiate VC2
//instantiate NAV2
SecondViewController *viewMe=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.view.window.rootViewController presentViewController:viewMe animated:NO completion:nil];
// the above method calls the presentViewController:animated:completion: method
}https://stackoverflow.com/questions/34350565
复制相似问题