2014-09-10 4 views
30

Я скомпилирую свой проект с помощью Xcode6 GM на iOS8 GM. При увольнении многих контроллеров просмотра, мое приложение всегда падает и область отладки показывает:Попытка отклонить контроллер презентации при переходе уже

"Trying to dismiss the presentation controller while transitioning already. transitionViewForCurrentTransition is not set, presentation controller was dismissed during the presentation? "

Я гугл и найти подобный случай и показывает ту же ошибку:

[self.viewController presentViewController:vc animated:NO completion:^{ 
     [self.viewController dismissViewControllerAnimated:NO completion:nil]; 
}]; 

Он прекрасно работает с использованием Xcode5 и IOS 7 . Что означает ошибка? Является ли iOS8 недовольным «Hack»? Заранее спасибо.

+0

Что вы пытаетесь достичь с помощью выше кода? –

+0

Я только что столкнулся с той же ошибкой. – Jeef

+0

Мое предположение - это принудительное представление в одну ориентацию. То, что я делаю, и у меня такая же ошибка. – Jeef

ответ

1

Мое решение:

dismissViewControllerAnimated:completion:If you present several view controllers in succession, thus building a stack of presented view controllers, calling this method on a view controller lower in the stack dismisses its immediate child view controller and all view controllers above that child on the stack. When this happens, only the top-most view is dismissed in an animated fashion; any intermediate view controllers are simply removed from the stack.

К примеру, у меня есть 4 просмотры: A-> B-> C-> D, и когда я хочу отклонить B, я сначала проверяю, хотите ли C также отклонить, используя objc_setAssociatedObject для присоединения/отсоединения объекта NSString, и если C тоже хочет уволить, просто отмените запрос C. Просто попробуйте отклонить B. B.

36

Вы пытаетесь изменить ориентацию устройства? Во всяком случае, на мой взгляд, вы могли бы попытаться изменить текущий код:

[self.navigationController presentViewController:vc animated:NO completion:^{ 
    dispatch_after(0, dispatch_get_main_queue(), ^{ 
     [self.navigationController dismissViewControllerAnimated:NO completion:nil]; 
    }); 
}]; 
+2

Вы можете просто отправить в основную очередь без нулевой задержки. – malex

+0

большое вам спасибо! это сработало для меня – sogwiz

+0

Любые новости об этом? Это довольно уродливый взлом, особенно если у вас аналогичная реализация в нескольких классах! –

-1
ThirdViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Third"]; 
UIViewController *VC1 = self.presentingViewController; 
[self dismissViewControllerAnimated:NO completion:^{}]; 
[VC1 presentViewController:vc animated:YES completion:^{}]; 
+0

Не могли бы вы добавить цвет вокруг своего ответа. Это никому не помогает. – Mika

+0

жаль, что я не получил. @Mika –

+0

Вы просто нарисовали несколько строк кода. Не могли бы вы рассказать о том, что делает этот код и почему это решение. – Mika

5

У меня была такая же проблема, и я нашел чистое решение, не используя 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]; 
} 
Смежные вопросы

 Смежные вопросы