16

我有一些代码要清理,viewWillDisappear:我只想在视图移回父视图控制器时使用。

- (void)viewWillDisappear:(BOOL)animated
{
    if ([self isMovingFromParentViewController] || [self isBeingDismissed]) {
        NSLog(@"isMovingFromParentViewController or isBeingDismissed");
        // clean up
    }
    [super viewWillDisappear:animated];
}

视图可以通过两种方式呈现:它可以由导航控制器推送,或者呈现为模式视图控制器(来自同一个导航控制器)。如果它被按下,然后弹出(按下后退按钮),我的清理代码就会运行。如果它呈现为模态视图控制器,然后被解除,则代码不会运行。

我这样解雇:

[rootViewController dismissModalViewControllerAnimated:YES];

我的问题是:为什么isBeingDismissed我关闭视图控制器时没有设置?

4

5 回答 5

32

如果这是模式导航控制器中第一个被关闭的视图控制器,则调用self.isBeingDimissed()fromviewWillDisappear:返回false

但是,由于整个导航控制器都被解除了,实际工作的是self.navigationController?.isBeingDismissed(),它返回true

于 2016-02-15T02:43:56.547 回答
18

正如@Yuval Tal 提到的,当您关闭嵌入在导航控制器中的控制器时,此标志不起作用。这是我使用的扩展:

extension UIViewController 
{
    var isAboutToClose: Bool {
        return self.isBeingDismissed ||      
               self.isMovingFromParent ||          
               self.navigationController?.isBeingDismissed ?? false
    }
}

.isBeingDismissed当您发现标准不起作用的另一种情况时,可以轻松扩展它。如果你找到了,让我们在评论中告诉我。

于 2017-06-07T09:02:23.523 回答
4

您的问题是您如何消除模态视图。rootViewController 是如何定义的?

当我打电话时[self dismissModalViewControllerAnimated:YES][self isBeingDismissed]评估结果为真。

当我调用[parentViewController dismissModalViewControllerAnimated:YES]then[self isBeingDismissed]评估为 true 时,parentViewController 是呈现模态视图的 UIViewController(注意:不是 UINavigationController)。

于 2012-04-20T18:08:36.243 回答
3

如果您有机会来到这里尝试isBeingDismissed在非模态呈现的视图控制器上使用,您可以随时检查topViewController您的属性navigationController,例如:

if navigationController?.topViewController != self {
    return
}
于 2017-10-11T16:20:08.603 回答
0
        viewController.isBeingPresented == NO;
        [rootVC presentViewController:viewController animated:NO completion:^{
            viewController.isBeingPresented == NO;
            viewController.isBeingDismissed == NO;
            [viewController dismissViewControllerAnimated:NO completion:^{
                viewController.isBeingDismissed == NO;
            }];
            viewController.isBeingDismissed == NO;    // is not work
        }];
        viewController.isBeingPresented == YES;     // is work
        viewController.isBeingPresented == NO;
        [rootVC presentViewController:viewController animated:NO completion:^{
            viewController.isBeingPresented == NO;
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                viewController.isBeingDismissed == NO;
                [viewController dismissViewControllerAnimated:NO completion:^{
                    viewController.isBeingDismissed == NO;
                }];
                viewController.isBeingDismissed == YES;    // is work
            });
        }];
        viewController.isBeingPresented == YES;     // is work
于 2016-07-01T02:18:46.613 回答