Подтвердить что ты не робот

Попытка отклонить контроллер презентации при переходе уже

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

"Попытка отклонить контроллер презентации во время перехода. переходViewForCurrentTransition не установлен, диспетчер презентации был уволен во время презентации?"

У меня есть googled и найти аналогичный случай и показывает ту же ошибку:

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

Он отлично работает с использованием Xcode5 и iOS7. Что означает ошибка? Является ли iOS8 недовольным "Hack"? Спасибо заранее.

4b9b3361

Ответ 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:^{}];