Попытка отклонить контроллер презентации при переходе уже
Я скомпилирую свой проект с помощью Xcode6 GM на iOS8 GM. При отклонении многих контроллеров просмотров мое приложение всегда вылетает, а область отладки показывает:
"Попытка отклонить контроллер презентации во время перехода. переходViewForCurrentTransition не установлен, диспетчер презентации был уволен во время презентации?"
У меня есть googled и найти аналогичный случай и показывает ту же ошибку:
[self.viewController presentViewController:vc animated:NO completion:^{
[self.viewController dismissViewControllerAnimated:NO completion:nil];
}];
Он отлично работает с использованием Xcode5 и iOS7. Что означает ошибка? Является ли iOS8 недовольным "Hack"? Спасибо заранее.
Ответы
Ответ 1
Мое решение:
ОтключитьViewControllerAnimated: завершение: если вы последовательно представляете несколько контроллеров представлений, создавая стек представленных контроллеров представлений, вызов этого метода на контроллере представления ниже в стеке отклоняет его непосредственный контроллер детского представления и все контроллеры представлений над этим дочерним элементом в стеке. Когда это происходит, только верхняя часть обзора отклоняется анимированным образом; любые контроллеры промежуточного вида просто удаляются из стека.
Например, у меня есть 4 вида: A- > B- > C- > D, и когда я хочу отклонить B, сначала проверьте, хочет ли C также отклонить, используя objc_setAssociatedObject для присоединения/отсоединения объекта NSString и если C тоже хочет уволить, тогда просто отмените запрос C. Просто позвоните в B.
Ответ 2
Вы пытаетесь изменить ориентацию устройства?
В любом случае, на мой взгляд, вы можете попытаться изменить свой текущий код на:
[self.navigationController presentViewController:vc animated:NO completion:^{
dispatch_after(0, dispatch_get_main_queue(), ^{
[self.navigationController dismissViewControllerAnimated:NO completion:nil];
});
}];
Ответ 3
У меня была такая же проблема, и я нашел чистое решение, чтобы избежать использования dispatch_async или dispatch_after.
Просто, как описано в исключении, вы пытаетесь отклонить контроллер представления, пока процесс представления продолжается.
Это означает, что после
- presentViewController:animated:completion:
выполняется блок завершения, и вы вызываете увольнение, переход не завершен.
Начиная с iOS 7 переход UIViewController имеет новый доступный метод
- transitionCoordinator
ПереходКоординатор дает вам
возможность блокировки блока завершения, как только переход завершится.
Объект, возвращаемый методом, соответствует протоколу UIViewControllerTransitionCoordinator. Зная, что решение действительно просто.
После вызова
- presentViewController:animated:completion:
координатор перехода правильно настроен каркасом.
Используйте
- animateAlongsideTransition:completion:
чтобы отправить соответствующий блок завершения.
Вот несколько фрагментов кода, которые лучше объясняют решение
void(^completion)() = ^() {
[modalViewController dismissViewControllerAnimated:YES completion:nil];
};
// This check is needed if you need to support iOS version older than 7.0
BOOL canUseTransitionCoordinator = [viewController respondsToSelector:@selector(transitionCoordinator)];
if (animated && canUseTransitionCoordinator)
{
[viewController presentViewController:modalViewController animated:animated completion:nil];
[viewController.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
completion();
}];
}
else
{
[viewController presentViewController:modalViewController animated:animated completion:completion];
}
Ответ 4
ThirdViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Third"];
UIViewController *VC1 = self.presentingViewController;
[self dismissViewControllerAnimated:NO completion:^{}];
[VC1 presentViewController:vc animated:YES completion:^{}];