【问题标题】:isBeingDismissed not set in viewWillDisappear:isBeingDismissed 未在 viewWillDisappear 中设置:
【发布时间】:2012-05-02 04:01:49
【问题描述】:

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

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

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

我这样解雇:

[rootViewController dismissModalViewControllerAnimated:YES];

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

【问题讨论】:

    标签: iphone ios uiviewcontroller modalviewcontroller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      if navigationController?.topViewController != self {
          return
      }
      

      【讨论】:

        【解决方案3】:
                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
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            当我调用 [self dismissModalViewControllerAnimated:YES] 时,[self isBeingDismissed] 的计算结果为 true。

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

            【讨论】:

            • 我可以确认isBeingDismissed() 在应该从UINavigationController 弹出视图控制器时返回false,例如折叠的UISplitViewController 中的详细视图控制器。
            猜你喜欢
            • 2016-09-30
            • 1970-01-01
            • 1970-01-01
            • 2010-12-03
            • 1970-01-01
            • 2022-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多