У меня была такая же проблема, и я нашел чистое решение, не используя dispatch_async или dispatch_after.
Просто, как описано в исключении, вы пытаетесь убрать контроллер представления, пока процесс представления продолжается. Это означает, что после завершения блокировать
- presentViewController:animated:completion:
называется, и вы вызываете распускать, то Переход не завершен.
Начиная с прошивкой 7 переход UIViewController имеет новый доступный метод
- transitionCoordinator
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];
}
Что вы пытаетесь достичь с помощью выше кода? –
Я только что столкнулся с той же ошибкой. – Jeef
Мое предположение - это принудительное представление в одну ориентацию. То, что я делаю, и у меня такая же ошибка. – Jeef