在viewWillDisappear方法中没有设置isBeingDismissed属性:

22

我有一些需要整理的代码在我的viewWillDisappear:方法中,在这个方法中,我只想在当前视图控制器返回到其父视图控制器时使用它。

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

视图可以通过导航控制器推送或作为模态视图控制器呈现(来自同一导航控制器)。如果它被推送,那么在弹出时(按下返回按钮),我的清理代码就会运行。如果它被呈现为模态视图控制器,然后被解除显示,代码就不会运行。

我这样解除显示:

[rootViewController dismissModalViewControllerAnimated:YES];
我的问题是:为什么在我关闭视图控制器时,isBeingDismissed没有被设置?
5个回答

35

如果这是模态导航控制器中第一个被解除的视图控制器,则从 viewWillDisappear: 调用 self.isBeingDismissed() 返回的是 false

然而,由于整个导航控制器正在被解除,实际上有效的是 self.navigationController?.isBeingDismissed(),它会返回 true


25

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

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

如果您发现标准的.isBeingDismissed不能正常工作,那么它可以很容易地扩展。如果您发现了其他情况,请在评论中告诉我们。


5

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

当我调用[self dismissModalViewControllerAnimated:YES]时,[self isBeingDismissed]会评估为true。

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


6
我可以确认,当视图控制器从UINavigationController中弹出时(例如在折叠的UISplitViewController中的详细视图控制器),isBeingDismissed()会返回false - bio

4

如果您在尝试在非模态呈现的视图控制器上使用isBeingDismissed,您可以始终检查您的navigationControllertopViewController属性,例如:

if navigationController?.topViewController != self {
    return
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接