16

viewWillDisappear:ビューが親View Controllerに戻るときにのみ使用したい、でクリーンアップするコードがいくつかあります。

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

ビューは 2 つの方法で表示できます: ナビゲーション コントローラーによってプッシュされるか、(同じナビゲーション コントローラーから) モーダル ビュー コントローラーとして表示されます。プッシュしてからポップ (戻るボタンを押す) すると、クリーンアップ コードが実行されます。モーダル ビュー コントローラーとして表示された後、閉じられた場合、コードは実行されません。

私は次のように却下します:

[rootViewController dismissModalViewControllerAnimated:YES];

私の質問はisBeingDismissed、ビュー コントローラーを閉じたときに設定されないのはなぜですか?

4

5 に答える 5

32

これが、閉じられるモーダル ナビゲーション コントローラーの最初のビュー コントローラーである場合、self.isBeingDimissed()fromを呼び出すと return がviewWillDisappear:返されますfalse

ただし、ナビゲーション コントローラー全体が閉じられているため、実際に機能するのはself.navigationController?.isBeingDismissed()で、これは を返しますtrue

于 2016-02-15T02:43:56.547 に答える
18

@Yuval Tal が述べたように、このフラグは、ナビゲーション コントローラー内に埋め込まれたコントローラーを閉じるときに機能しません。私が使用する拡張機能は次のとおりです。

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

標準が機能しない別のケースが見つかった場合は、簡単に拡張できます.isBeingDismissed。見つけたら、コメントでお知らせください。

于 2017-06-07T09:02:23.523 に答える
4

あなたの問題は、モーダルビューをどのように却下するかです。rootViewController はどのように定義されていますか?

私が呼び出すと[self dismissModalViewControllerAnimated:YES][self isBeingDismissed]trueと評価されます。

呼び出すと true と評価され、 [parentViewController dismissModalViewControllerAnimated:YES]parentViewController[self isBeingDismissed]はモーダル ビューを表示した UIViewController になります (注: UINavigationController ではありません)。

于 2012-04-20T18:08:36.243 に答える
3

何らかの機会isBeingDismissedに、非モーダル表示のビュー コントローラーで使用しようとしてここに来た場合は、いつでも のtopViewControllerプロパティを確認できnavigationControllerます。たとえば、次のようになります。

if navigationController?.topViewController != self {
    return
}
于 2017-10-11T16:20:08.603 に答える
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
于 2016-07-01T02:18:46.613 に答える