Контроллер навигации popViewControllerAnimated: yes работает не так, как ожидалось

Я использую следующую строку кода:

[self.navigationController popViewControllerAnimated:YES];

Но он не ведет себя в ios 7, как это происходит в ios 6. Иногда происходит не поп-контроллер, а мы нажимаем кнопку 2 раза подряд.
Результатом является резкое поведение на панели навигации и освобождение контроллера, но показывающее то же самое на ui.
Поэтому, когда мы нажимаем что-либо на этом контроллере, это приводит к сбою, поскольку контроллер уже освобожден.

Ответ 1

Убедитесь, что вы используете код в потоке пользовательского интерфейса.

Ответ 2

[self.navigationController popToRootViewControllerAnimated:YES];

Этот метод будет перемещаться к корню вашего навигационного контроллера.

Вы можете проверить свою иерархию viewController со следующим кодом.

    NSLog(@"%@",self.navigationController.viewControllers);

Ответ 3

Я решил эту проблему следующим образом:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                                                                     UINavigationController * nav = tabbarControl.selectedViewController;
                                                                     [nav.viewControllers objectAtIndex:0];
[nav setViewControllers:@[[nav.viewControllers objectAtIndex:0]] animated:NO];
                                                                tabbarControl.selectedIndex = 0;
 });

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

Ответ 4

Попробуйте этот код для всплывающего окна контроллера просмотра из стека навигации

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];

Ответ 5

У меня была такая же проблема на iOS 8.

Я решил подклассифицировать UINavigationController и добавить этот код:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.delegate = self;
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
    return [super popViewControllerAnimated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}

Я в основном блокирую все пользовательские взаимодействия во время поп-анимации. Я знаю, что это грязное решение, но это единственное, что я нашел, что решает проблему.

Ответ 6

Я думаю, что должно работать без dispatch_async. Я попал в ту же проблему, но я узнал причину.

Мы должны проверить, назначена ли текущая сцена правильному имени контроллера представления в раскадровке. (Инспектор идентичности → класс)

Если вы подключаете действие кнопки к файлу m, а затем вставляете имя контроллера представления, это не работает.

Итак, вы должны удалить соединение и вставить правильное имя контроллера представления, а затем снова подключить действие к m файлу.

Ответ 7

Я создал свой проект из шаблона master-detail, который использует контроллер разделенного представления. В моем случае удаление контроллера разделенного представления решило эту проблему.