0

プロジェクトで UIAlertController に以下のコードを使用しています。

if([[[UIDevice currentDevice] systemVersion]floatValue] >= 8.0){

            UIAlertController * alert=   [UIAlertController
                                          alertControllerWithTitle:@"Input Error"
                                          message:@"Please enter a valid email."
                                          preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* okAction = [UIAlertAction
                                       actionWithTitle:@"OK"
                                       style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction * action)
                                       {
                                           [alert dismissViewControllerAnimated:YES completion:nil];

                                       }];

            [alert addAction:okAction];

            [self presentViewController:alert animated:YES completion:nil];
        }
        else
        {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Input Error"
                                                            message:@"Please enter a valid email"
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil, nil];
        [alertView show];
        }

以下の警告メッセージが表示されます。

Warning: Attempt to present <UIAlertController: 0x7f8da58df1f0>  on <MBComplaintsViewController: 0x7f8da36454d0> which is already presenting (null)

Objective C を使用して UIAlertController を適切に使用する方法を教えてください。

ありがとう、アビン・コッシー・チェリヤン

4

2 に答える 2

1

はい、@Alexander によると、このようにアラート コントローラを明示的に却下するべきではありません。

Apple のエンジニアによると、UIAlertController が表示されるたびに新しいウィンドウが追加されるため、ウィンドウを閉じようとすると、アラート コントローラーが消えてもウィンドウは残ります。

したがって、これを処理するには2つの方法があります-

方法 1 - 明示的に却下 しない UIAlertController を明示的に却下せず、ユーザーに任せます

方法 2 - 独自のウィンドウを使用する UIAertController でカテゴリを作成するだけです サンプル コードは次のとおりです - .h

#import <UIKit/UIKit.h>

@interface UIAlertController (MyAdditions)

@property(nonatomic,strong) UIWindow *alertWindow;

-(void)show;

@end

.m _

#import "UIAlertController+MyAdditions.h"
#import <objc/runtime.h>

@implementation UIAlertController (MyAdditions)

@dynamic alertWindow;

- (void)setAlertWindow:(UIWindow *)alertWindow {
    objc_setAssociatedObject(self, @selector(alertWindow), alertWindow, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIWindow *)alertWindow {
    return objc_getAssociatedObject(self, @selector(alertWindow));
}

- (void)show {
    self.alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.alertWindow.rootViewController = [[UIViewController alloc] init];

    // window level = topmost + 1
    UIWindow *topWindow = [UIApplication sharedApplication].windows.lastObject;
    self.alertWindow.windowLevel = topWindow.windowLevel + 1;

    [self.alertWindow makeKeyAndVisible];
    [self.alertWindow.rootViewController presentViewController:self animated:YES completion:nil];
}

-(void)hide {
    self.alertWindow.hidden = YES;
    self.alertWindow = nil;
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    // just to ensure the window gets desroyed
    self.alertWindow.hidden = YES;
    self.alertWindow = nil;
}

アラート コントローラを表示するには

UIAlertCntroller *alert = ## initialisation##;
// will show the alert
[alert show];

//to dismiss 
[alert hide];

[アラートdismissViewControllerAnimated:YES完了:nil];

ここで私のサンプル実装の1つをチェックアウトすることもできます

于 2016-04-14T20:38:08.817 に答える
0

私はあなたの問題については知りませんが、あなたはそれをすべきではありません

handler:^(UIAlertAction * action)
                                       {
                                           [alert dismissViewControllerAnimated:YES completion:nil];

                                       }];

とにかく、あなたのいずれかで却下されますactions

于 2015-11-15T11:34:53.187 に答える