Ошибка подтверждения в - [UINavigationController popToViewController: transition:] - PullRequest
0 голосов
/ 31 октября 2018

Недавно я столкнулся с проблемой:

- (void)popToVC {
    FirstViewController *f1 = [FirstViewController new];
    f1.text = @"1111111";
    SecondViewController *f2 = [SecondViewController new];
    f2.text = @"2222222";
    ThirdViewController *f3 = [ThirdViewController new];
    f3.text = @"3333333";
    FirstViewController *f4 = [FirstViewController new];
    f4.text = @"4444444";
    FirstViewController *f5 = [FirstViewController new];
    f5.text = @"5555555";
    FirstViewController *f6 = [FirstViewController new];
    f6.text = @"6666666";
    [f2 addChildViewController:f3];
    [f2 addChildViewController:f4];
    [f2.view addSubview:f3.view];
    [self.navigationController pushViewController:f1 animated:YES];
    [self.navigationController pushViewController:f2 animated:YES];
    [self.navigationController pushViewController:f5 animated:YES];
    [self.navigationController pushViewController:f6 animated:YES];
    // [self.navigationController popToViewController:f3 animated:YES];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.navigationController popToViewController:f3 animated:YES];
    });
}

Когда я выполняю этот код, тогда получается следующее исключение:

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

Если я раскомментирую [self.navigationController popToViewController:f3 animated:YES]; и удаляю код следующей строки dispatch_after, то ничего не происходит.

Почему, когда я пишу [self.navigationController popToViewController:f3 animated:YES]; в dispatch_after, код вылетает, и не происходит, если я не использую dispatch_after?

1 Ответ

0 голосов
/ 31 октября 2018

Зависит от последовательности push и pop для пакетных операций. Если первая операция прошла успешно, остальные ошибки будут пропущены.

// [self.navigationController popToViewController:f3 animated:YES];
[self.navigationController pushViewController:f1 animated:YES];
[self.navigationController pushViewController:f2 animated:YES];
[self.navigationController pushViewController:f5 animated:YES];
[self.navigationController pushViewController:f6 animated:YES];

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

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
   // [self.navigationController popToViewController:f5  animated:YES];
    [self.navigationController popToViewController:f3 animated:YES];
});

Раскомментирование первой строки не вызовет каких-либо проблем, если первая операция была успешно выполнена.

Экстремальный пример подобен следующему, который все еще будет в порядке.

[self.navigationController pushViewController:f1 animated:YES];
[self.navigationController pushViewController:f2 animated:YES];
[self.navigationController popToViewController:f5 animated:YES];
[self.navigationController popToViewController:f6 animated:YES];
[self.navigationController popToViewController:f3 animated:YES];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [self.navigationController popToViewController:f1  animated:YES];
  [self.navigationController popToViewController:f3 animated:YES];
  [self.navigationController popToViewController:f6 animated:YES];

});

Надеюсь, что это ответ.

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