0

が、私はそうのような最上位のビューコントローラの上にモーダル提示このUIAlertController持っ却下ます:UINavigationControllerが追加

UIViewController *top = [Utility topController]; 

UIAlertController *alertController 
= [UIAlertController alertControllerWithTitle:@"Error" 
             message:@"input string too long" 
           preferredStyle:UIAlertControllerStyleAlert]; 

UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
    }]; 

[alertController addAction:ok]; 

UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { 
    }]; 

[alertController addAction:cancel]; 

[top presentViewController:alertController 
        animated:true 
       completion:nil]; 
} 

方法は、私は一番上のビューコントローラを見つけるをループでありますView Controllerを提示し、私は警告コントローラの上に存在しないことを確認することによって:

+ (UIViewController *)topController { 
    UIViewController *topController = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 

    while (topController.presentedViewController) { 
    if ([topController.presentedViewController class] == [UIAlertController class]) { 
     [topController.presentedViewController dismissViewControllerAnimated:YES completion:nil]; 
     break; 
    } 
    topController = topController.presentedViewController; 
    } 
    return topController; 
} 

これはすべてが順調と良いですが、それはだとして何のUIViewControllerトップコントローラであることはUIAlertControllerを提示。私がOKをタップまたはキャンセルすると、UIAlertControllerは暗黙的に閉じられます。しかし、私はカスタムのUINavigationControllerを持っています。これは何らかの理由でUINavigationControllerにもオーバーライドされています。dismissViewControllerAnimated:が呼び出されます。

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { 
    [super dismissViewControllerAnimated:flag completion:completion]; 
} 

なぜそのUINavigationControllerは、それがpresentedViewController自体だけでなく、却下だ持っているということですか?私はそうのようなUINavigationControllerを提示することを追加する必要があります:

[self presentViewController:nav animated:YES completion:nil]; 

なぜそれがdismissViewControllerAnimated:は二回呼び出されるように見えるということですか? dismissViewControllerAnimatedへの暗黙の呼び出しは、であるUINavigationControllerpresentedViewControllerでのみ呼び出されるべきではありませんか?

答えて

0

「トップ」コードでdismissViewControllerを呼び出すと、まったく意味がありません。

UIAlertControllerを提示しているものは、アラートを表示した後に戻る必要があります。そのため、UIAlertControllerを1つだけアクティブにする必要があります。したがって、新しいUIAlertControllerを表示するために、 UIAlertController。ユーザーのアラートを任意に却下する必要はありません。あなたのアプリはユーザーに何かを伝える必要があったので、読んだ時点を決定させてください。

は、変更を提案する:

は、次に使用するために、あなたの "トップ" の行を変更するには、現在のViewController

@implementation UIViewController (Current) 

#import "UIViewController+Current.h" 

@implementation UIViewController (Current) 

+(UIViewController*) findBestViewController:(UIViewController*)vc { 

    if (vc.presentedViewController) { 

     // Return presented view controller 
     return [UIViewController findBestViewController:vc.presentedViewController]; 

    } else if ([vc isKindOfClass:[UISplitViewController class]]) { 

     // Return right hand side 
     UISplitViewController* svc = (UISplitViewController*) vc; 
     if (svc.viewControllers.count > 0) 
      return [UIViewController findBestViewController:svc.viewControllers.lastObject]; 
     else 
      return vc; 

    } else if ([vc isKindOfClass:[UINavigationController class]]) { 

     // Return top view 
     UINavigationController* svc = (UINavigationController*) vc; 
     if (svc.viewControllers.count > 0) 
      return [UIViewController findBestViewController:svc.topViewController]; 
     else 
      return vc; 

    } else if ([vc isKindOfClass:[UITabBarController class]]) { 

     // Return visible view 
     UITabBarController* svc = (UITabBarController*) vc; 
     if (svc.viewControllers.count > 0) 
      return [UIViewController findBestViewController:svc.selectedViewController]; 
     else 
      return vc; 

    } else { 

     // Unknown view controller type, return last child view controller 
     return vc; 

    } 

} 
+(UIViewController*) currentViewController { 
    // Find best view controller 
    UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; 
    return [UIViewController findBestViewController:viewController]; 
} 

.hファイル

#import <UIKit/UIKit.h> 

@interface UIViewController (Current) 

+(UIViewController*) currentViewController; 

@end 

を見つけるためのカテゴリを使用しますそれ

UIViewController *top = [UIViewController currentViewController]; 
関連する問題