Ответ 1
Убедитесь, что вы используете код в потоке пользовательского интерфейса.
Я использую следующую строку кода:
[self.navigationController popViewControllerAnimated:YES];
Но он не ведет себя в ios 7, как это происходит в ios 6. Иногда происходит не поп-контроллер, а мы нажимаем кнопку 2 раза подряд.
Результатом является резкое поведение на панели навигации и освобождение контроллера, но показывающее то же самое на ui.
Поэтому, когда мы нажимаем что-либо на этом контроллере, это приводит к сбою, поскольку контроллер уже освобожден.
Убедитесь, что вы используете код в потоке пользовательского интерфейса.
[self.navigationController popToRootViewControllerAnimated:YES];
Этот метод будет перемещаться к корню вашего навигационного контроллера.
Вы можете проверить свою иерархию 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;
});
Когда вы задерживаете одну секунду, появится представление из пользовательского интерфейса, после чего появится представление из стека навигации, я думаю, это проблема серий анимации.
Попробуйте этот код для всплывающего окна контроллера просмотра из стека навигации
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count -2] animated:YES];
У меня была такая же проблема на 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];
}
Я в основном блокирую все пользовательские взаимодействия во время поп-анимации. Я знаю, что это грязное решение, но это единственное, что я нашел, что решает проблему.
Я думаю, что должно работать без dispatch_async. Я попал в ту же проблему, но я узнал причину.
Мы должны проверить, назначена ли текущая сцена правильному имени контроллера представления в раскадровке. (Инспектор идентичности → класс)
Если вы подключаете действие кнопки к файлу m, а затем вставляете имя контроллера представления, это не работает.
Итак, вы должны удалить соединение и вставить правильное имя контроллера представления, а затем снова подключить действие к m файлу.
Я создал свой проект из шаблона master-detail, который использует контроллер разделенного представления. В моем случае удаление контроллера разделенного представления решило эту проблему.