isBeingDismissed未设置viewWillDisappear:

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

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

该视图可以通过两种方式呈现:可以由导航控制器推送,也可以作为模式视图控制器(来自同一导航控制器)呈现。 如果它被推,然后popup(按后退button),我的清理代码运行。 如果它作为一个模态视图控制器呈现,然后解散,代码不会运行。

我这样解雇:

 [rootViewController dismissModalViewControllerAnimated:YES]; 

我的问题是:当我解雇我的视图控制器时,为什么不是isBeingDismissed设置?

你的问题是你如何解散你的模态观点。 如何定义rootViewController?

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

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

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

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

正如@Yuval Tal所提到的那样,当你解散导航控制器内嵌的控制器时,这个标志不起作用。 这是我使用的一个扩展:

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

当标准的.isBeingDismissed时,可以很容易地扩展它。 如果你发现,让我们,让我知道在评论中。

  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 

如果你有机会来到这里试图在非模态expression的视图控制器上使用isBeingDismissed ,你可以随时检查你的navigationControllertopViewController属性,例如:

 if navigationController?.topViewController != self { return }