21

У меня есть приложение, которое почти работает отлично. Вот как мое приложение структурировано:Продолжайте получать «Неуравновешенные вызовы для перехода на начало/конец появления для ошибки <ViewController>»

6 Всего View Controllers на раскадровке. Наиболее важными являются первые 3 контроллера просмотра. Начальный контроллер просмотра имеет кнопки «Вход» и «Регистрация». Кнопка «Войти» modally представляет собой контроллер входа в систему, а кнопка «Регистрация» представляет собой регистратор вида регистрации.

Контроллер регистрации регистрации имеет 3 поля для имени пользователя, пароля и электронной почты, а затем кнопку «отправить». Кнопка отправки передает данные на мой веб-сервер, и если все отправляется успешно, он сам вызывает метод «performSegueWithIdentifier».

Вот заявление:

[self performSegueWithIdentifier:@"superSegue" sender:self]; 

Я провел 2 часа сегодня вечером, пытаясь получить выше вызов метода для работы, и он, наконец, делает работу. Чтобы заставить его работать, мне нужно было выбрать свой контроллер просмотра отчетов на раскадровке и перейти к редактору> Вставить в> контроллер навигации (если я правильно помню, я должен был это сделать, потому что контроллер представления регистрации представлен в виде модально). Затем я перетащил из кнопки отправки диспетчера регистрации View View в контроллер View, на который я хочу нажать и выбрать Push, а затем введите имя идентификатора.

В любом случае, все вышеизложенное прекрасно работает, пока я не попытаюсь использовать кнопку «Назад» на контроллере представления, которую мы нажали на вызов метода. Если я нажму кнопку «Назад», он перейдет на 90% черный экран с пустой навигационной панелью вверху с помощью кнопки «Назад» и, конечно, эта кнопка «назад» ничего не делает.

Это ошибка, которую я получаю в консоли:

Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0> 

Проверочный View Controller является View Controller, что Регистрация View Controller выталкивает с помощью метода performSegueWithIdentifier.

Кто-нибудь знает, как я могу исправить эту ошибку?

Я включил скриншот ниже того, что выглядит в моей раскадровке в xcode. Существует контроллер представления, который я кодировал, но еще не подключен, и не должен иметь никакого значения, так что вы можете игнорировать контроллер просмотра справа от входа VC.

enter image description here

ответ

13

Я нашел ответ сегодня утром в другой StackOverflow вопрос. Ответ можно найти here.

Когда я изначально настроил Push Segue, я нажал и перетащил его с помощью кнопки, а также вызвал метод executeSegueWIthIdentifier внутри реализации метода IBAction этой кнопки. Это привело к тому, что на кнопочном прессе выполнялись 2 идентичных нажатия. Я просто оставил вызов метода в IBAction, удалил старый push segue и создал новый push segue только на этот раз, когда я нажал и перетащил из всего контроллера View, а не его кнопку.

+0

I была аналогичная проблема. спасибо –

+0

Я проверяю свою кнопку, но она не работает, но она по-прежнему вызывает неуравновешенные вызовы для начала/конца перехода на внешний вид, используя пользовательский segue. – DeckyFx

+0

Другой распространенной проблемой является не вызов супермастефа в подклассе UIViewController. Например, MyViewController.viewWillAppear() не вызывал super.viewWillAppear() и приводил к этой ошибке, потому что внутреннее состояние просмотра не обновлялось. – parleer

3

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

[sourceVC viewWillDisappear:YES]; 
[destinationVC viewWillAppear:YES]; 

И следующее в блоке завершения:

if (finished) { 
    [sourceVC viewDidDisappear:YES]; 
    [destinationVC viewDidAppear:YES]; 
    [super setSelectedIndex:selectedIndex]; 
} 

Проблема может еще произойти, если несколько изменений SelectedIndex произойдет до анимации конца ,

+0

Я не уверен, что это так, но вы можете использовать функции addChildViewController и removeFromParentController (и другие), как описано в документах Apple о контейнерах UIViewController: https://developer.apple.com/library/ios/featuredarticles /ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html –

+0

У меня была такая же проблема и решайте быстро: http://stackoverflow.com/a/37096645/4483716 Надежда может помочь кому-то. – Dasoga

+1

Эта идея помогла мне с несбалансированными ошибками перехода при изменении страницы UITabBarController. Я также мог использовать методы beginAppearanceTransition и endAppearanceTransition вместо прямого вызова 'viewWillDisappear' /' viewWillAppear' и 'viewDidDisappear' /' viewDidAppear'. Документация для методов перехода на внешний вид предполагает не обращение к 'viewWillAppear' и т. Д. Непосредственно для дочерних представлений. – Undrea

9

Я решил эту проблему, обернув ее.

dispatch_async(dispatch_get_main_queue()) { 
    //call your performSegueWithIdentifier in here 
} 
+0

Потрясающе! Используется этот метод в контексте модального представления контроллера вида «блокировка экрана» через 'presentViewController (_: анимированный: завершение)' над базовым (корневым) контроллером представлений из 'AppDelegate applicationDidBecomeActive (_ :)' ... до этого иерархия окон контроллера корневого представления была полностью установлена. Больше не нужно откладывать презентацию до того, как «viewDidLoad (анимированный:)» корневого контроллера ... уродливая развязка управления представлением. Благодаря! –

+0

удивительный исправление! получал это при вызове 'popViewController (animated:)' –

1

В моем случае это предупреждение было вызвано вызовом popToRootViewController из UINavigationController в то время отображались модальный вид. Когда я переместил popToRootViewController после отклонения модального вида, появится предупреждение.

1

причина неудавшегося: Это сообщение получить отображается, если вы толкание/представления другого вида контроллера от viewWillAppear, loadView, инициализация или viewDidLoad метода тока View Controller

Решения Двигайте толкание/представление кода метод viewDidAppear решит проблему

Причина: in viewDidLoad не все фантастические анимации уже закончены, тогда как в viewDidAppear все сделано.

1

Я работал его, и это хорошо для меня причины неудавшийся: Это сообщение получить отображается, если вы толкание/представления другого вида контроллера от TabBarController, Решения: установите viewController.modalPresentationStyle = .overCurrentContext, то настоящий viewController topViewController.present(vc, animated: true, completion: nil)

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