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
,你可以随时检查你的navigationController
的topViewController
属性,例如:
if navigationController?.topViewController != self { return }