在出现时关闭View Controller,而不显示它

时间:2015-11-17 18:45:24

标签: ios iphone uiviewcontroller

我有一个视图控制器。我有一个叫做“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.视图以模态呈现,通过导航控制器和推送进行现在不是一个选择,有没有办法实现这一目标?

由于

6 个答案:

答案 0 :(得分:2)

你可以这样做。在C视图中,控制器类在您需要时调用此方法(单击示例按钮或任何其他内容):

- (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的动画。

为了在解除BB控制器时隐藏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控制器快照下:)