Приложение аварийно завершает работу, если переход контроллера вида выполняется слишком быстро

Я использую сдерживание контроллера представления для перехода между 6 контроллерами представления. Переходы контролируются с помощью сегментированного элемента управления. Все это работает нормально, если только кнопки на сегментированном элементе управления не нажаты до завершения анимации предыдущего перехода. В этой ситуации приложение аварийно завершает работу с

'Контроллеры дочерних представлений и должны иметь общий родительский контроллер представления при вызове -[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]'

Код:

[self transitionFromViewController:currentVC
                  toViewController:newVC
                          duration:1.0
                           options:UIViewAnimationOptionTransitionFlipFromRight
                        animations:nil
                        completion:^(BOOL finished) {
                            [currentVC removeFromParentViewController];
                            [newVC didMoveToParentViewController:self];
                            currentVC = newVC;
                        }];

Должен ли я отключить сегментированный элемент управления, пока анимация не будет завершена? Или это лучший способ избежать этой проблемы?


person Adam Strait    schedule 16.09.2013    source источник


Ответы (1)


Вы можете отключить и снова включить взаимодействие с приложением, вызвав

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
[[UIApplication sharedApplication] endIgnoringInteractionEvents];

когда анимация начинается и заканчивается соответственно. Затем приложение будет игнорировать все взаимодействия (события касания) до тех пор, пока анимация не будет завершена, поэтому сегмент никогда не получит событие, пока не станет безопасным (анимация завершена).

Я думаю, что этот подход используется и в некоторых встроенных контроллерах контейнеров. Однако будьте осторожны с продолжительностью анимации. Если анимация будет длиться долго, может показаться, что приложение плохо отвечает, что ухудшает работу пользователя.

person Lukas Kukacka    schedule 16.09.2013
comment
Это исправило это. Спасибо - person Adam Strait; 16.09.2013
comment
Разве недостаточно просто отключить взаимодействие с самим сегментированным элементом управления (self.segmentedControl.userInteractionEnabled = NO;)? Кажется, это работает для моего варианта использования. - person Robert Atkins; 29.04.2014
comment
@RobertAtkins Конечно, если этого достаточно для ваших нужд. Мой ответ - самое экстремальное решение, которое предотвращает сбой, но, конечно, не идеальное решение (или предлог для покрытия проблемного кода) ;-) - person Lukas Kukacka; 29.04.2014