Несбалансированные вызовы для начала / окончания переходов внешнего вида для <UITabBarController: 0x197870> - PullRequest
111 голосов
/ 25 октября 2011

Я читал ТАК о другом пользователе, который сталкивался с подобной ошибкой , но эта ошибка в другом случае.

Я получил это сообщение при первоначальном добавлении View Controller:

Unbalanced calls to begin/end appearance transitions for 
<UITabBarController: 0x197870>

Структура приложения выглядит следующим образом:

У меня есть TabBarController с 5 вкладками, связанный с 5 View Controllers. На начальной вкладке показа я вызываю новый View Controller для наложения как введение в приложение.

Я использую этот код для вызова контроллера представления представления:

IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release]; 

После того, как появится этот IntroVC контроллер отображения, появится указанная выше ошибка.

p.s. Я использую xCode 4.2 и iOS 5.0 SDK, разрабатываю приложение для iOS 4.3.

Ответы [ 21 ]

94 голосов
/ 25 октября 2011

Не видя больше окружающего кода, я не могу дать однозначного ответа, но у меня есть две теории.

  1. Вы не используете UIViewController обозначенный инициализатор initWithNibName:bundle:. Попробуйте использовать его вместо init.

  2. Также, self может быть одним из контроллеров представления панели вкладок. Всегда представляйте контроллеры представления от самого верхнего контроллера представления, что означает, в этом случае попросите, чтобы контроллер панели вкладок представил контроллер представления наложения от имени контроллера представления. Вы по-прежнему можете сохранять любые делегаты обратного вызова в реальном контроллере представления, но у вас должен присутствовать и отклоняться контроллер панели вкладок.

39 голосов
/ 01 сентября 2012

Я исправил эту ошибку, изменив анимацию с ДА на НЕТ.

От:

[tabBarController presentModalViewController:viewController animated:YES];

Кому:

[tabBarController presentModalViewController:viewController animated:NO];
16 голосов
/ 23 сентября 2014

Как опубликовано danh

Вы можете сгенерировать это предупреждение, представив модальный vc до завершения инициализации приложения.т.е. запустите приложение-шаблон с вкладками и представьте модальный vc поверх self.tabBarController в качестве последней строки в приложении: didFinishLaunching.Предупреждение появляется.Решение: позвольте стеку сначала развернуться, представьте модальный vc в другом методе, вызванном с помощью executeSelector withDelay: 0.0

Попробуйте переместить метод в viewWillAppear и защитить его, чтобы он выполнялся только один раз(рекомендую установить свойство)

5 голосов
/ 09 февраля 2016

Другое решение для многих случаев состоит в том, чтобы убедиться, что переход между UIViewController s происходит после завершения неподходящей (как во время инициализации) процедуры, выполнив:

__weak MyViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf presentViewController:vc animated:YES];
});

Это правило также для pushViewController:animated: и т. Д.

3 голосов
/ 14 октября 2013

У меня была такая же проблема.Я вызвал метод внутри viewDidLoad внутри моего первого UIViewController

- (void)viewDidLoad{
    [super viewDidLoad];

    [self performSelector:@selector(loadingView)
               withObject:nil afterDelay:0.5];
}

- (void)loadingView{

    [self performSegueWithIdentifier:@"loadedData" sender:self];
}

Внутри второго UIViewController Я сделал то же самое с задержкой 0,5 секунды.После изменения задержки на более высокое значение все заработало нормально.Это похоже на то, что после другого сеанса сеанс не может быть выполнен слишком быстро.

3 голосов
/ 08 декабря 2012

У меня возникла та же проблема, когда мне нужно было представить свой контроллер представления входа в систему из другого контроллера представления. Если пользователь не авторизован, я сделал это в методе ViewDidLoad моего другого контроллера представления (если не авторизован -> presentModalViewController).Когда я начал делать это в методе ViewDidAppear, я решил эту проблему.Думаю, что ViewDidLoad только инициализирует свойства и после этого начинается фактический алгоритм представления представления!Вот почему вы должны использовать метод viewDidAppear для модальных переходов!

2 голосов
/ 06 ноября 2011

У меня было много проблем с той же проблемой.Я решил эту проблему с помощью

  1. Инициирование ViewController с помощью метода storyboad instantiateViewControllerWithIdentifier.то есть Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
  2. [self.tabBarController presentModalViewController : vc animated:YES];

У меня в раскадровке видоискатель, по какой-то причине использование только [[introvc alloc] init]; не сработало для меня.

2 голосов
/ 08 февраля 2016

У меня была эта проблема из-за опечатки:

override func viewDidAppear(animated: Bool) {
    super.viewWillAppear(animated)

вместо

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

Он вызывал "WillAppear" в супер вместо "DidAppear"

2 голосов
/ 18 декабря 2013

Я решил это, написав

[self.navigationController presentViewController:viewController 
                                        animated:TRUE 
                                      completion:NULL];
2 голосов
/ 31 июля 2016

Если вы используете transitioningDelegate (не в данном примере), также установите modalPresentationStyle на .Custom.

Свифт

let vc = storyboard.instantiateViewControllerWithIdentifier("...")
vc.transitioningDelegate = self
vc.modalPresentationStyle = .Custom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...