我有一个视图控制器。我有一个叫做“dismissOnAppear”的旗帜。基本上如果此标志设置为YES,我想在应用程序返回时立即关闭我的视图控制器。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.dismissOnApear)
{
[self dismissViewControllerAnimated:NO completion:nil];
}
}
问题是视图出现了一瞬间然后解雇。有什么办法可以在我返回时关闭视图控制器,而不会显示一秒钟吗?
编辑:有关更多背景信息:
我有ViewControllers A,B和C.一个礼物B,然后是B礼物C.当我关闭C而不是B时,我想返回A.视图以模态呈现,通过导航控制器和推送进行现在不是一个选择,有没有办法实现这一目标?
由于
答案 0 :(得分:2)
- (void)turnBackToAViewController{
for (UIViewController *controller in self.navigationController.viewControllers) {
//Do not forget to import AViewController.h
if ([controller isKindOfClass:[AViewController class]]) {
[self.navigationController popToViewController:controller
animated:YES];
break;
}
}
}
答案 1 :(得分:1)
只需循环显示控制器,直到到达父级,然后从那里解除视图。
UIViewController *vc = self.presentingViewController;
while (vc.presentingViewController) {
vc = vc.presentingViewController;
}
[vc dismissViewControllerAnimated:YES completion:NULL];
答案 2 :(得分:0)
简单的方法是使用UINAvigationController,但这似乎不是一个选择。如果避免使用navigationController的原因是因为你想要赢得动画,你仍然可以使用navigationController,并使用自定义转换(参见UINavigationControllerDelegate方法:
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);
另一种方法是使用与UINavigatioController类似的接口实现您自己的containerViewController,它可以处理您想要的内容(当您为其编写代码时)。为了实现这一点,您需要了解parent和childviewController,并检查Apple的containerViewController指南:
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
你能解释为什么你现在想要使用UINavigationController吗?
答案 3 :(得分:0)
你可以在C中将一个弱引用保存到ViewController A并告诉VC A关闭当前显示的viewController(它是B,所以它可能需要C一起)。
答案 4 :(得分:0)
1.在CViewController中创建一个公共属性:
@property(nonatomic, weak) BViewController *bViewController;//please import BViewController//must be **weak**(avoid retain cycle)
2.当您从BViewController显示CViewController
时CViewControllerObj.bViewController = self;
3.当您在CViewController中时,请执行以下操作:
- (void)turnBackToAViewController{
[self dismissViewControllerAnimated:YES completion:^{
[self.bViewController dismissViewControllerAnimated:NO completion:^{
}];
}];
}
希望它会有所帮助:)
答案 5 :(得分:0)
这里使用两个模态视图控制器无缝解除结构A>B>C
的动画。
为了在解除B
和B
控制器时隐藏C
控制器,请在呈现C
控制器时创建快照视图(在B
中控制器)并显示它:
[self presentViewController:cViewController animated:YES completion:^{
UIView *snapshotView = [cViewController.view snapshotViewAfterScreenUpdates:YES];
[self.view addSubview:snapshotView];
}];
然后,当您需要关闭两个控制器(在C
控制器中)时,只需在C
控制器上调用此方法:
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
它很快会显示B
控制器,但不要担心我们已将其隐藏在C
控制器快照下:)