が、私はそうのような最上位のビューコントローラの上にモーダル提示この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
への暗黙の呼び出しは、であるUINavigationController
のpresentedViewController
でのみ呼び出されるべきではありませんか?