Подтвердить что ты не робот

Представить UIAlertController из AppDelegate

Я пытаюсь представить UIAlertController из AppDelegate в моем приложении iOS. Ниже приведено предупреждение и настоящий метод.

UIAlertController *alert = [UIAlertController alertControllerWithTitle:cTitle message:cMessage preferredStyle:UIAlertControllerStyleAlert];

//Configure alert and actions

[self.window.rootViewController presentViewController:alert animated:TRUE completion:nil];

Однако, когда я пытаюсь представить предупреждение, оно не появляется, и я получаю следующее предупреждение в консоли.

Warning: Attempt to present <UIAlertController: 0x145f5d60> on <UINavigationController: 0x146590f0> whose view is not in the window hierarchy!

Что вызывает ошибку и как ее исправить?

4b9b3361

Ответ 1

Вы также можете использовать этот код, если хотите его запустить из файла didFinishLaunchingWithOptions. Надеюсь, это поможет.

dispatch_async(dispatch_get_main_queue(), {
              let importantAlert: UIAlertController = UIAlertController(title: "Action Sheet", message: "Hello I was presented from appdelegate ;)", preferredStyle: .ActionSheet)
            self.window?.rootViewController?.presentViewController(importantAlert, animated: true, completion: nil)
        })

Ответ 2

попробуйте этот код..

-(void)application:(UIApplication *)application               didReceiveLocalNotification:(UILocalNotification *)notification
{
 NSLog(@"rakshapettu");
 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"AlertView" message:@"I am an AlertView" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {
                                                          [alert dismissViewControllerAnimated:YES completion:nil];
                                                      }];
[alert addAction:defaultAction];
UIWindow *alertWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
alertWindow.rootViewController = [[UIViewController alloc] init];
alertWindow.windowLevel = UIWindowLevelAlert + 1;
[alertWindow makeKeyAndVisible];
[alertWindow.rootViewController presentViewController:alert animated:YES completion:nil]; 
}

Ответ 3

Лучше использовать что-то вроде:

var hostVC = self.window?.rootViewController

while let next = hostVC?.presentedViewController {
    hostVC = next
}

hostVC?.presentViewController(alertController, animated: true, completion: nil)

Предыдущие ответы не будут работать, если вы уже представляете контроллер модального представления.

Ответ 4

вы вызываете его до того, как окно закроется, и фактически отображается диспетчер навигации:

"Предупреждение. Попытайтесь представить, чей вид не находится в иерархии окон!"

Скорее всего, вы это делаете в applicationDidFinishLaunching?


ИСТОЧНИК ждать.. нравится делать это, когда вид действительно появляется

ИЛИ

один "взломать" будет заставлять просмотр и окно самостоятельно:

[self.window addSubview:self.rootViewController.view];
[self.window makeKeyAndVisible];

Ответ 5

Я пытался сделать то же самое, но не работал, потому что после изменения viewcontroller все еще возвращал исходный контроллер представления и выдавал ошибку whose view is not in the window hierarchy!. Наконец, я нашел решение этой проблемы:

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

Но мне нужно заставить контроллеры представлений обновить de keyWindow следующим образом:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    UIApplication.sharedApplication().keyWindow!.rootViewController = self
    UIApplication.sharedApplication().keyWindow!.makeKeyAndVisible()
}

Ответ 6

Вы можете попробовать называть его viewDidAppear вместо viewDidLoad. У меня была аналогичная ошибка, и я исправил ее.

Ответ 7

Использование Alert Controller:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
dispatch_async(dispatch_get_main_queue(), {

    //INTERNET NOT AVAILABLE ALERT
    var internetUnavailableAlertController = UIAlertController (title: "Network Unavailable", message: "Please check your internet connection settings and turn on Network Connection", preferredStyle: .Alert)

    var settingsAction = UIAlertAction(title: "Settings", style: .Default) { (_) -> Void in
        let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
        if let url = settingsUrl {
            UIApplication.sharedApplication().openURL(url)
        }
    }
    var cancelAction = UIAlertAction(title: "Okay", style: .Default, handler: nil)
    internetUnavailableAlertController .addAction(settingsAction)
    internetUnavailableAlertController .addAction(cancelAction)
    self.window?.rootViewController!.presentViewController(internetUnavailableAlertController , animated: true, completion: nil)
    })

Использование AlertView:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    dispatch_async(dispatch_get_main_queue(), {

        //INTERNET NOT AVAILABLE ALERTVIEW

        let internetUnavailableAlert =  UIAlertView(title: "Network Unavailable", message: "Please check your internet connection settings and turn on Network Connection", delegate: self, cancelButtonTitle: "Okay")
        internetUnavailableAlert.show()
        })

  return true
 }
}