Переключение между контроллерами представления между двумя экранными контроллерами навигации вызывает исключение несогласованной иерархии - PullRequest
4 голосов
/ 24 ноября 2011

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

Проблема в том, что я получаю исключение UIViewControllerHierarchyInconsistency, которое впервые появилось в iOS 5. ЯЯ не уверен, как обойти это.Использование методов push / pop работает нормально, однако мне нужно вставить что-то дальше в стек, чтобы получить доступ к самому массиву контроллера представления.Код:

- (void)swapViewController:(UIViewController *)controller {

    NSMutableArray *leftStack = [NSMutableArray arrayWithArray:_leftNavController.viewControllers];
    NSMutableArray *rightStack = [NSMutableArray arrayWithArray:_rightNavController.viewControllers];

    if ([leftStack containsObject:controller]) {

        // Left to right
        [leftStack removeObject:controller];
        [rightStack addObject:controller];
        [_leftNavController setViewControllers:leftStack];
        [_rightNavController setViewControllers:rightStack];

    } else {

        // Right to left
        [rightStack removeObject:controller];
        [leftStack addObject:controller];
        [_rightNavController setViewControllers:rightStack];
        [_leftNavController setViewControllers:leftStack];

    }

}

Полное исключение:

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<MyViewController: 0x6c4e7f0> should have parent view controller:<UINavigationController: 0x6a5d100> but requested parent is:<UINavigationController: 0x6a58c10>'

1 Ответ

0 голосов
/ 27 ноября 2011

Я получил ответ с форумов разработчиков :

Когда вы берете контроллеры представления UINavigationController и вставляете их в другой навигационный контроллер, они все еще логически находятся в первом навигационном контроллере, отсюда и исключение.

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

Итак, я избавлюсь от оригинальных навигационных контроллеров и воссоздаю их для каждого перехода VC.

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