Предупреждение об исправлении: попытка представить ViewController в NavigationController, чье представление не находится в иерархии окон.

В настоящее время я настроил режим входа в систему для пользователей моего приложения. Ниже приведен код, который представляет пользователю это представление входа в систему:

 // Handle how we present the view
    if (self.notificationToProcess != nil) {
        [self.navigationController dismissViewControllerAnimated:YES completion:^{
            SWNotificationsViewController *viewController = [[NotificationsViewController alloc] init];
            viewController.initialDataID = self.notificationToProcess[@"Data"];
            self.notificationToProcess = nil;

            [self.navigationController pushViewController:viewController animated:YES];
        }];
    } else if (self.detailURL != nil) {
        [self.navigationController dismissViewControllerAnimated:YES completion:^{
            WebViewController *wvc = [[WebViewController alloc] init];
            wvc.URL = self.detailURL;
            wvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
            [self.navigationController presentViewController:wvc animated:YES completion:nil];

            self.detailURL = nil;
        }];
    } else {
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    }

Сейчас я пытаюсь сначала отобразить веб-представление, если пользователь только что обновил приложение. Ниже показано, как выглядит этот новый код:

// Handle how we present the view.
    if (self.notificationToProcess != nil) {
        [self.navigationController dismissViewControllerAnimated:YES completion:^{
            SWNotificationsViewController *viewController = [[SWNotificationsViewController alloc] init];
            viewController.initialDataID = self.notificationToProcess[@"Data"];
            self.notificationToProcess = nil;

            [self.navigationController pushViewController:viewController animated:YES];
        }];
    } else if (self.detailURL != nil) {
        [self.navigationController dismissViewControllerAnimated:YES completion:^{
            SWWebViewController *wvc = [[SWWebViewController alloc] init];
            wvc.URL = self.detailURL;
            wvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
            [self.navigationController presentViewController:wvc animated:YES completion:nil];

            self.detailURL = nil;
        }];
else if (![versionOfLastRun isEqual:currentVersion])
    {
        SWWebViewController *webViewController = [[SWWebViewController alloc] init];
        NSString *url=@"http://someurl";
        webViewController.URL = url;
        webViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self.navigationController presentViewController:webViewController animated:YES completion:nil];
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"VersionOfLastRun"];
        [[NSUserDefaults standardUserDefaults] synchronize];

    }
    else if (versionOfLastRun == nil){
        // First start after installing the app
    }

    else {
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    }

Однако, когда я запускаю приложение, веб-представление не отображается, я получаю предупреждение:

Предупреждение: попытайтесь представить ViewController на NavigationController, чье представление не находится в иерархии окон!

Может ли кто-нибудь помочь мне диагностировать проблему? Благодарю вас!


person narner    schedule 26.01.2015    source источник
comment
На самом деле я работаю над более старым проектом без раскадровки (все делается программно).   -  person narner    schedule 26.01.2015


Ответы (3)


Похоже, ваш viewController не находится в иерархии контроллера навигации. Это означает, что ваш контроллер не подключен к стеку навигационных контроллеров, который должен обрабатывать представленные контроллеры.

Еще одна вещь, которая должна помочь, — это настроить корневой контроллер представления следующим образом:

self.window.rootViewController = self.ViewController;

РЕДАКТИРОВАТЬ: поскольку вы упомянули, что не используете раскадровки, установка rootViewController должна помочь.

person Miknash    schedule 26.01.2015
comment
Привет, Ник (меня тоже зовут!), спасибо за ответ. Я добавил эту строку, но получил тот же результат. Интересно, это потому, что этот код находится в моем AppDelegate.m? - person narner; 26.01.2015
comment
Какой контроллер вы установили для root? Я поставил ViewController в качестве примера. Попробуйте установить wvc в качестве контроллера rootView (это тот, который вам нужен, верно) - person Miknash; 26.01.2015
comment
Да, я установил wvc в качестве rootViewController, но Xcode по-прежнему сообщает мне, что его представление не находится в иерархии представлений. - person narner; 26.01.2015
comment
Я добавил эту строку, чтобы увидеть, что такое окно rootViewController, и получил журнал (null): NSLog(@%@, self.window.rootViewController); - person narner; 26.01.2015

Попробуйте установить rootViewController окна в контроллер навигации после инициализации контроллера навигации:

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:mainController];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = navController;

Вот как я делаю это без раскадровки.

person Vikas Shah    schedule 26.01.2015

Проблема была в том, что я не позвонил self.navigationController dismissViewControllerAnimated:YES completion:^

После исправления этого (см. список ниже) мой WebView отобразился, как и ожидалось.

else if (![versionOfLastRun isEqual:currentVersion])
    {
        [self.navigationController dismissViewControllerAnimated:YES completion:^{
            SWWebViewController *webViewController = [[SWWebViewController alloc] init];

            NSLog(@"%@", self.window.rootViewController);

            NSString *url=@"http://devstatwatch.drbsystems.com/releases_mobile.php";
            webViewController.URL = url;
            webViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
            [self.navigationController presentViewController:webViewController animated:YES completion:nil];
            [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"VersionOfLastRun"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }];
    }
person narner    schedule 26.01.2015