Контроллер навигации 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];