isBeingDismissed未在viewWillDisappear中设置:

nev*_*ing 10 iphone uiviewcontroller modalviewcontroller ios

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

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

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

我这样解雇:

[rootViewController dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

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

Yuv*_*Tal 23

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

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


Kub*_*bba 7

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

extension UIViewController 
{
    var isAboutToClose: Bool {
        return self.isBeingDismissed ||      
               self.isMovingFromParentViewController ||          
               self.navigationController?.isBeingDismissed ?? false
    }
}
Run Code Online (Sandbox Code Playgroud)

当标准.isBeingDismissed无效时,如果发现另一种情况,可以轻松扩展.如果你发现,让我们在评论中告诉我.


Joe*_*oel 5

你的问题是你如何驳回你的模态视图。rootViewController 是如何定义的?

当我打电话[self dismissModalViewControllerAnimated:YES]时,[self isBeingDismissed]结果为 true。

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

  • 我可以确认,当 viewController 被认为是从“UINavigationController”中弹出时,“isBeingDismissed()”返回“false”,例如折叠的“UISplitViewController”中的详细视图控制器。 (6认同)