Несбалансированные вызовы для начала / окончания переходов внешнего вида для <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 ]

2 голосов
/ 29 ноября 2015

У меня была эта проблема со сторонним кодом.Кто-то забыл установить супер внутри viewWillAppear и viewWillDisappear в пользовательском классе TabBarController.

- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    // code...
}

or

- (void) viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];
    // code...
}
1 голос
/ 03 января 2014

У меня была такая же ошибка.У меня есть панель вкладок с 3 элементами, и я невольно пытался вызвать корневой контроллер представления элемента 1 в элементе 2 моей панели вкладок, используя performSegueWithIdentifier.

. Что происходит, так это то, что он вызывает контроллер представленияи через несколько секунд возвращается к корневому контроллеру представления элемента 2. и регистрирует эту ошибку.

По-видимому, нельзя вызвать корневой контроллер представления элемента для другого элемента.

Поэтому вместо performSegueWithIdentifier

я использовал [self.parentViewController.tabBarController setSelectedIndex:0];

Надеюсь, это кому-нибудь поможет.

1 голос
/ 15 августа 2014

У меня была такая же проблема, и я решил опубликовать, если кто-то столкнется с чем-то похожим.

В моем случае я подключил распознаватель жестов длинным нажатием к своему UITableViewController.

UILongPressGestureRecognizer *longPressGesture = [[[UILongPressGestureRecognizer alloc]
                                                   initWithTarget:self
                                                   action:@selector(onLongPress:)]
                                                  autorelease];
[longPressGesture setMinimumPressDuration:1];
[self.tableView addGestureRecognizer:longPressGesture];

В моем селекторе onLongPress я запустил свой следующий контроллер представления.

- (IBAction)onLongPress:(id)sender {

    SomeViewController* page = [[SomeViewController alloc] initWithNibName:@"SomeViewController" bundle:nil];

    [self.navigationController pushViewController:page animated:YES];

    [page release];

}

В моем случае я получил сообщение об ошибке, потому что распознаватель длинных нажатий сработал более одного раза, и в результате мой "SomeViewController "был помещен в стек несколько раз.

Решением было добавить логическое значение, чтобы указать, когда SomeViewController был помещен в стек.Когда был вызван метод viewWillAppear моего UITableViewController, я снова установил логическое значение NO.

1 голос
/ 08 мая 2016

В Swift 2 + у меня работает:

У меня есть UITabBarViewController в раскадровке, и я выбрал свойство selectedIndex, например:

enter image description here

Но я удаляю его и добавляю в свой метод viewDidLoad моего начального класса, например:

override func viewDidLoad() {
   super.viewDidLoad()
   self.tabBarController?.selectedIndex = 2
}

Я надеюсь, что смогу кому-то помочь.

0 голосов
/ 26 апреля 2019

У меня была такая же проблема.При разработке я хотел обойти экраны.Я переходил от одного контроллера представления к другому в viewDidLoad, вызывая метод селектора.

Проблема в том, что мы должны позволить ViewController завершить переход перед переходом на другой ViewController.

Это решило мою проблему: задержка необходима, чтобы позволить ViewController завершить переход перед переходом на другой.

self.perform(#selector(YOUR SELECTOR METHOD), with: self, afterDelay: 0.5)

0 голосов
/ 17 октября 2017

Вы должны убедиться, что - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated и - (void) endAppearanceTransition созданы вместе в классе.

0 голосов
/ 06 марта 2013

У меня была эта проблема, когда я перешел от корневого TVC к TVC A, а затем к TVC B. После нажатия кнопки «загрузка» в TVC BI захотелось вернуться обратно к корневому TVC (нет необходимости повторно посещать TVC A, так почему сделай это). У меня было:

//Pop child from the nav controller
[self.navigationController popViewControllerAnimated:YES];
//Pop self to return to root
[self.navigationController popViewControllerAnimated:YES];

... который выдал ошибку "Несбалансированные вызовы для начала / конца и т. Д.". Следующее исправило ошибку, но без анимации:

//Pop child from the nav controller
[self.navigationController popViewControllerAnimated:NO];
//Then pop self to return to root
[self.navigationController popViewControllerAnimated:NO];

Это было мое окончательное решение, без ошибок и все еще анимированное:

//Pop child from the nav controller
[self.navigationController popViewControllerAnimated:NO];
//Then pop self to return to root, only works if first pop above is *not* animated
[self.navigationController popViewControllerAnimated:YES];
0 голосов
/ 07 апреля 2016

Я обнаружил, что если вы используете раскадровку, вы захотите поместить код, представляющий новый контроллер представления, в viewDidAppear.Это также избавит от предупреждения «Представление контроллеров представления на контроллерах отдельного представления не рекомендуется».

0 голосов
/ 29 августа 2013

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

По сутион дважды выполнял вызов segue, выдавал эту ошибку и фактически выдвигал мой взгляд дважды.Исправление состояло в том, чтобы удалить один из вызовов segue.

Надеюсь, это поможет кому-то так же уставшему, как и я!

0 голосов
/ 22 апреля 2014

На самом деле вам нужно дождаться окончания анимации.Таким образом, вы можете делегировать UINavigationController и не допустить нажатия до окончания анимации.

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    waitNavigation = NO;
}


-(void)showGScreen:(id)gvc{

    if (!waitNavigation) {
        waitNavigation = YES;
        [_nav popToRootViewControllerAnimated:NO];
        [_nav pushViewController:gvc animated:YES];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...