8

UIAlertViewレガシーと新しいの違いはUIAlertController、後者は特定のビューコントローラーにpresentViewController:animated:completion:. これは、私のユースケースにとって厄介な問題をUIAlertController引き起こします: 2 番目のビューコントローラーが表示されたときに (たとえば、ネットワーク接続の失敗によるエラーダイアログ)、既に表示されている場合 (たとえば、評価ダイアログ) はどうなるでしょうか。この場合、2番目は表示されないことを経験しましたUIAlertController

編集: 現時点でアラートを表示しようとしていますが、現在何か表示されているかどうかはわかりません。

この状況にどのように対処しますか?

4

5 に答える 5

5

アラートを表示できるビューコントローラーを見つけるための回避策を見つけました。私もここに答えを投稿しました:

@implementation UIViewController (visibleViewController)

- (UIViewController *)my_visibleViewController {

    if ([self isKindOfClass:[UINavigationController class]]) {
        // do not use method visibleViewController as the presentedViewController could beingDismissed
        return [[(UINavigationController *)self topViewController] my_visibleViewController];
    }

    if ([self isKindOfClass:[UITabBarController class]]) {
        return [[(UITabBarController *)self selectedViewController] my_visibleViewController];
    }

    if (self.presentedViewController == nil || self.presentedViewController.isBeingDismissed) {
        return self;
    }

    return [self.presentedViewController my_visibleViewController];
}

@end

// To show a UIAlertController, present on the following viewcontroller:
UIViewController *visibleViewController = [[UIApplication sharedApplication].delegate.window.rootViewController my_visibleViewController];
于 2014-11-16T10:42:13.170 に答える
0

これは私が使用しているものです。このように、アラートが既に表示されている場合は、アプリではなく、ユーザーがそれを却下することを好みます。したがって、ビューがすでに警告を表示している場合は、5 秒待ってからもう一度試します。

追加したいのですが、これはあまりテストしませんでしたが、うまくいきます.(私が行った1つのテストから)、何かが欠けていないことを願っています。簡単すぎる :)

-(void) alertUserWithTitle:(NSString*) title Message:(NSString*) message
{
    UIAlertController* alert = [UIAlertController alertControllerWithTitle:title                                                                              message:message
                                                                            preferredStyle:UIAlertControllerStyleAlert];

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

                    [alert addAction:defaultAction];

                    if(self.presentedViewController == nil)
                    {
                        [self presentViewController:alert animated:YES completion:nil];
                    }else
                    {
                        double delayInSeconds = 2.0;
                        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

                        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

                            [self alertUserWithTitle:title Message:message];

                        });

                    }
}
于 2016-12-14T21:42:51.893 に答える