*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Попытка получить доступ к контроллеру представления, который не существует». - PullRequest
0 голосов
/ 20 марта 2019

У меня есть это исключение, которое не перехватывается, даже находится в исключении обработки (@try{}@catch{}), возможно, это что-то очень простое, но я не вижу его в данный момент. Исключение говорит 'Попытка получить доступ к контроллеру представления, который не существует.' Я считаю, что параметр передается nil, но я его не вижу:

-(void) theProblemMethod
{

    dispatch_async(dispatch_get_main_queue(), ^{
        @try {
                [[self topViewController] dismissViewControllerAnimated:YES completion: ^{

                     UIViewController * rootViewControler = nil;
                    if ((rootViewControler = (UIViewController *) [UIApplication sharedApplication].keyWindow.rootViewController))
                     {
                         if([self topViewController])
                             [(UINavigationController *)[self topViewController].navigationController popToViewController:rootViewControler animated:YES];
                         if ((rootViewControler = (UIViewController *) [[[[UIApplication sharedApplication] delegate] window] rootViewController].presentedViewController)) {
                             [rootViewControler dismissViewControllerAnimated:YES completion:
                              ^{
                                  //do something here
                              }];
                         }
                     }
                 }];

        } @catch (NSException *exception) {
            NSLog(@"There is a problem at [myClass theProblemMethod]  Exception: %@, reason: %@",  [exception name], [exception reason]);
        } @finally {}
     });
}

Кто-нибудь видит проблему?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

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

0 голосов
/ 20 марта 2019

Я нашел проблему! Я только что обнаружил, что проблема указана в строке:

[(UINavigationController *)[self topViewController].navigationController popToViewController:rootViewControler animated:YES];

Мой код пытался получить доступ к свойству navigationController после отклонения topViewController view (его родитель).

Решением для этого было сохранение navigationController сильного текста во временной переменной перед dismiss topViewController после @try:

UINavigationController * aNavigationController = (UINavigationController *)[[self topViewController] navigationController];

Наконец:

 -(void) theProblemMethod
    {

        dispatch_async(dispatch_get_main_queue(), ^{
            @try {
                    UINavigationController * aNavigationController = (UINavigationController *)[[self topViewController] navigationController];
                    [[self topViewController] dismissViewControllerAnimated:YES completion: ^{

                         UIViewController * rootViewControler = nil;
                        if ((rootViewControler = (UIViewController *) [UIApplication sharedApplication].keyWindow.rootViewController))
                         {
                                 [(UINavigationController *)[self topViewController].navigationController popToViewController:rootViewControler animated:YES];
                             if ((rootViewControler = (UIViewController *) [[[[UIApplication sharedApplication] delegate] window] rootViewController].presentedViewController)) {
                                 [rootViewControler dismissViewControllerAnimated:YES completion:
                                  ^{
                                      //do something here
                                  }];
                             }
                         }
                     }];

            } @catch (NSException *exception) {
                NSLog(@"There is a problem at [myClass theProblemMethod]  Exception: %@, reason: %@",  [exception name], [exception reason]);
            } @finally {}
         });
    }

В основном я удаляю A и одновременно пытаюсь вызвать его дочернего элемента A.child внутри A rightпосле A был удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...