Я читал ТАК, что другой пользователь столкнулся с аналогичной ошибкой , но эта ошибка в другом случае.
Я получил это сообщение, когда изначально добавил View Controller:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
Структура приложения следующая:
У меня есть TabBarController с 5 вкладками, связанный с 5 контроллерами представления. На вкладке начального показа я вызываю новый контроллер представления для наложения в качестве представления приложения.
Я использую этот код для вызова контроллера представления:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
После IntroVC
появления этого контроллера представления отображается указанная выше ошибка.
ps Я использую xCode 4.2 и iOS 5.0 SDK, разрабатываю приложение для iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
источник
источник
Ответы:
Не видя больше окружающего кода, я не могу дать однозначного ответа, но у меня есть две теории.
Вы не используете
UIViewController
«ы назначенный инициализаторinitWithNibName:bundle:
. Попробуйте использовать его вместо простоinit
.Также
self
может быть одним из контроллеров представления панели вкладок. Всегда представляйте контроллеры представления от самого верхнего контроллера представления, что означает, что в этом случае попросите контроллер панели вкладок представить контроллер представления наложения от имени контроллера представления. Вы по-прежнему можете сохранить любые делегаты обратного вызова для реального контроллера представления, но вы должны иметь контроллер панели вкладок и закрыть его.источник
Я исправил эту ошибку, изменив анимацию с ДА на НЕТ.
Из:
Для того, чтобы:
источник
Автор сообщения: danh
Вы можете сгенерировать это предупреждение, представив модальный vc до завершения инициализации приложения. т.е. запустите приложение-шаблон приложения с вкладками и представьте модальный vc поверх self.tabBarController в качестве последней строки в приложении: didFinishLaunching. Появляется предупреждение. Решение: позвольте стеку сначала развернуться, представьте модальный vc в другом методе, вызываемом с помощью performSelector withDelay: 0.0
Попробуйте переместить метод в viewWillAppear и защитить его, чтобы он выполнялся только один раз (рекомендуется настроить свойство).
источник
viewWillAppear
и нетviewDidAppear
?Другое решение для многих случаев - убедиться, что переход между
UIViewController
s происходит после завершения неподходящей (например, во время инициализации) процедуры, выполнив:Это также общее для и
pushViewController:animated:
т. Д.источник
У меня такая же проблема. Я вызвал метод
viewDidLoad
внутри своего первогоUIViewController
Внутри второго
UIViewController
я сделал то же самое с задержкой 0,5 секунды. После изменения задержки на большее значение все заработало. Это похоже на то, что переход не может быть выполнен слишком быстро после другого перехода.источник
viewDidAppear
чтобы он былUINavigationController
готов с этим справиться. Я сменил свой пост на это;)У меня была такая же проблема, когда мне нужно было представить мой контроллер представления входа в систему из другого контроллера представления. Если пользователь не авторизован, я сделал это в методе ViewDidLoad моего другого контроллера представления (если не авторизован -> presentModalViewController). Когда я начал делать это в методе ViewDidAppear, я решил эту проблему. Я думаю, что ViewDidLoad только инициализирует свойства, и после этого начинается фактический алгоритм просмотра просмотра! Вот почему вы должны использовать метод viewDidAppear для модальных переходов!
источник
У меня возникла эта проблема из-за опечатки:
вместо того
Он звонил "WillAppear" в супер вместо "DidAppear"
источник
У меня было много проблем с той же проблемой. Я решил это
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
У меня есть viewcontroller в моей раскадровке, по какой-то причине использование только
[[introvc alloc] init];
для меня не сработало.источник
Я решил это написав
источник
У меня была эта проблема со сторонним кодом. Кто-то забыл установить super внутри viewWillAppear и viewWillDisappear в пользовательском классе TabBarController.
источник
Если вы используете
transitioningDelegate
(не случай в примере на этот вопрос в), а также установитьmodalPresentationStyle
в.Custom
.стриж
источник
У меня была такая же ошибка. У меня есть панель вкладок с 3 элементами, и я бессознательно пытался вызвать контроллер корневого представления элемента 1 в элементе 2 моей панели вкладок, используя
performSegueWithIdentifier
.Что происходит, так это то, что он вызывает контроллер представления и через несколько секунд возвращается к корневому контроллеру представления элемента 2 и регистрирует эту ошибку.
По-видимому, вы не можете вызвать контроллер корневого представления элемента для другого элемента.
Так что вместо
performSegueWithIdentifier
я использовал
[self.parentViewController.tabBarController setSelectedIndex:0];
Надеюсь, это кому-то поможет.
источник
У меня была такая же проблема, и я подумал, что опубликую, если кто-то другой столкнется с чем-то похожим.
В моем случае я прикрепил распознаватель жестов длительного нажатия к своему UITableViewController.
В моем селекторе onLongPress я запустил свой следующий контроллер представления.
В моем случае я получил сообщение об ошибке, потому что распознаватель длительного нажатия сработал более одного раза, и в результате мой «SomeViewController» был помещен в стек несколько раз.
Решением было добавить логическое значение, указывающее, когда SomeViewController был помещен в стек. Когда был вызван мой метод viewWillAppear моего UITableViewController, я снова установил логическое значение NO.
источник
Я обнаружил, что если вы используете раскадровку, вам нужно поместить код, представляющий новый контроллер представления, в viewDidAppear. Он также избавится от предупреждения «Представление контроллеров представления на контроллерах отсоединенного представления не рекомендуется».
источник
В Swift 2+ у меня работает:
У меня есть UITabBarViewController в раскадровке, и я выбрал свойство selectedIndex следующим образом:
Но я удаляю его и добавляю в свой метод viewDidLoad моего исходного класса, например:
Я надеюсь, что смогу кому-то помочь.
источник
На самом деле вам нужно дождаться окончания анимации push. Таким образом, вы можете делегировать UINavigationController и предотвратить нажатие до окончания анимации.
источник
Как предположил @danh, моя проблема заключалась в том, что я представлял модальный vc до того, как он
UITabBarController
был готов. Однако мне было неудобно полагаться на фиксированную задержку перед представлением контроллера представления (из моего тестирования мне нужно было использовать задержку 0,05–0,1 сperformSelector:withDelay:
). Мое решение добавить блок , который вызывается наUITabBarController
«SviewDidAppear:
метод:PRTabBarController.h:
PRTabBarController.m:
Сейчас в
application:didFinishLaunchingWithOptions:
источник
вам нужно убедиться, что - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated и - (void) endAppearanceTransition создается вместе в классе.
источник
Я была такая же проблема. При разработке хотел обойти экраны. Я переходил от одного контроллера представления к другому в viewDidLoad, вызывая метод селектора.
Проблема в том, что мы должны позволить ViewController завершить переход перед переходом к другому ViewController.
источник
Swift 5
источник
У меня была эта проблема, когда я переходил от корневого TVC к TVC A, а затем к TVC B. После нажатия кнопки «загрузить» в TVC BI хотел сразу вернуться к корневому TVC (нет необходимости повторно посещать TVC A, зачем это делать) , Я имел:
... что выдавало ошибку «Несбалансированные вызовы для начала / завершения и т. д.». Следующее исправило ошибку, но без анимации:
Это было мое окончательное решение, без ошибок и все еще анимированное:
источник
Я столкнулся с этой ошибкой, когда подключил UIButton к действию перехода раскадровки (в IB), но позже решил, что кнопка будет вызывать программный вызов
performSegueWithIdentifier
забыв удалить первую из IB.По сути, он дважды выполнил вызов segue, выдал эту ошибку и дважды подтолкнул мое представление. Исправление заключалось в удалении одного из вызовов перехода.
Надеюсь, это поможет кому-то так же уставшему, как я!
источник