Контроллер навигации popViewControllerAnimated: yes не работает должным образом

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

[self.navigationController popViewControllerAnimated:YES];

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

8 ответов

Проверьте, выполняете ли вы код в потоке пользовательского интерфейса

[self.navigationController popToRootViewControllerAnimated:YES];

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

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

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

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

 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;
 });

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

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

Я смог исправить это, как описано в некоторых других ответах здесь, выполнив всплывающую навигацию позже в основной очереди. Эквивалент Swift:

      DispatchQueue.main.async {
    self.rootViewController.popViewController(animated: true)
}

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

У меня была такая же проблема на 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];
}

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

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

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

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

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

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

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

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];
Другие вопросы по тегам