Несбалансированные вызовы для начала / окончания переходов внешнего вида для <FirstViewController: 0x2a2c00>

У меня есть эта проблема, когда я симулирую свое приложение, это не ошибка или предупреждение, но оно появляется в моей консоли, кто-нибудь когда-либо испытывал это раньше?

25 ответов

Решение

В моем случае эта ошибка возникает, когда вы быстро нажимаете на две вкладки в виде таблицы.

Результат вызывает неправильное название, кнопка возврата исчезает. Кто-то упомянул, что когда вы выдвигаете представление, set animated:NO, Ошибка исчезнет, ​​но все равно вызывает некоторое странное поведение. Он выдвигает два представления, затем вам нужно дважды вернуться назад, чтобы вернуться к экрану просмотра таблицы.

Метод, который я пытался решить эту проблему:

добавлять BOOL cellSelected;

в viewWillAppearcellSelected = YES;

в didselectcell делегат if (cellSelected){cellSelected = NO; do action ; }

Это помогает предотвратить быстрое нажатие двух разных ячеек.

В моем случае это произошло, когда я вызвал [self performSegueWithIdentifier:@"SomeIdentifier" sender:self]; в пределах UINavigationController Предметы viewDidLoad метод.

Перемещая его в viewDidAppear Метод решил проблему.

Вероятно, причина в том, что в viewDidLoad не все модные анимации уже были закончены, тогда как в viewDidAppear все сделано

У меня тоже есть эта проблема. Я нашел два решения этой проблемы:

  1. Вы можете увидеть это решение выше.
  2. Я нашел подкласс от UINavigationController где эта проблема решена. Буферизованный навигационный контроллер

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

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

У меня было много проблем с той же проблемой. Я решил это таким образом

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

2) установить animated:YES к НЕТ, и это решило проблему. например. [self.navigationController pushViewController: viewController_Obj animated:NO];

У меня была та же проблема с использованием контроллера навигации и подталкивания к нему других контроллеров. Я пытался использовать https://github.com/Plasma/BufferedNavigationController и несколько других подходов, но у меня это не сработало. Потратив некоторое время на выяснение этого, я заметил, что эта проблема возникает, если вы пытаетесь выдвинуть новый контроллер представления во время выполнения предыдущей транзакции (анимации) (я предполагаю, что она будет длиться примерно 0,5 секунды). В любом случае, я сделал быстрое решение с делегированием контроллера навигации и ожиданием завершения анимации.

Убедитесь, что вы не забыли использовать -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear для вызова правильного супер-метода при перегрузке этих методов. Например, в моем случае я не соответствовал имени метода, как это:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

обратите внимание, что появляются и исчезают методы не совпадают

"Несбалансированные вызовы для начала / окончания появления переходов для"

Говорит, что анимация запускается до того, как последняя связанная анимация не была сделана. Итак, вы нажимаете какой-либо контроллер представления, прежде чем нажать новый? Или может выскочить в корень? если да, попробуйте сделать это без анимации, т.е. [self.navigationController popToRootViewControllerAnimated:NO];

И посмотрите, решит ли это проблему. В моем случае это помогло.

У меня была похожая проблема, связанная с перемоткой модальных диалогов. Разместил решение здесь...

/questions/35486848/unwind-segue-ot-modalpopover-privodyaschij-k-nesbalansirovannyim-vyizovam-chtobyi-nachat-zakonchit-perehodyi-poyavleniya/35486866#35486866

[Проблема]

Nav Controller -> VC1 -Push -> VC2 -PopOver или Модальный переход -> VC3.

VC3 возвращается к VC1.

Когда Segue от VC2 до VC3 имеет PopOver и Modal, размотка заканчивается предупреждением: несбалансированные вызовы, чтобы начать / закончить переходы внешнего вида для UIViewController"

Если Segue от VC до VC нажат, предупреждение исчезло.

[Решение]

Было бы здорово, если бы логика раскрутки позаботилась об этом. Может быть, это ошибка, а может и нет. В любом случае, решение состоит в том, чтобы сделать VC2 (контроллер, у которого есть всплывающее окно) целью перемотки, затем подождать, пока он не появится, прежде чем вызвать навигационный контроллер. Это гарантирует, что анимация перемотки (всплывающее окно) имеет достаточно времени для завершения, прежде чем двигаться дальше назад. Даже с отключенной анимацией все равно придется ждать, иначе вы получите ошибку.

Ваш код для VC2 должен быть следующим. (Swift)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

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

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

Swift 4

Моя проблема заключалась в том, что я представлял другой VC до того, как закончил рендеринг текущего.

Решение было представить мой следующий ВК после быстрой задержки.

ЧТО ВЫ НЕ ДОЛЖНЫ ДЕЛАТЬ

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

ЧТО ТЫ ДОЛЖЕН ДЕЛАТЬ

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

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

Способ удаления сообщения об ошибке: перенесите код нажатия на viewDidAppear метод решит проблему

Я получил эту проблему, потому что я вызывал UIPrintInteractionController из viewController без UITabbar и ни UINavigationBar. Похоже, что UIPrintInteractionController не получил правильный printInteractionControllerParentViewController. Реализация метода в делегате и возвращение текущего rootViewController работали для меня.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

У меня была реализована некоторая логика, чтобы ждать нажатия UIViewController пока все данные не были загружены. В этой логике произошла ошибка, из-за которой UIViewController слишком рано, пока идет еще один вызов API.

Это вызвало то же самое UIViewController быть дважды подтолкнутым UINavigationController и дал это предупреждение.

У меня также была эта проблема, когда я нажал кнопку из NIB. Оказывается, я случайно связал кнопку для отправки события двум методам IBAction, каждый из которых выполнял pushViewController:animated:

У меня похожая проблема при попытке сделать:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

в такой функции, как - (void) popUpToLevelTwo; и положить return; в конце функции решает проблему

Я также получил это в

[self dismissModalViewControllerAnimated:YES];

Я изменил YES к NOи это решило проблему.

Для чего это стоит, я получил эту же ошибку, когда не включая вызов [super viewDidLoad:animated] в моем viewDidLoad переопределения.

Ситуация может возникнуть, если вы добавляете представление с контроллером модального представления в качестве вложенного представления. Лучше всего использовать:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Это в основном говорит, что жизненный цикл представления не оптимизирован для тех viewControllers, которые вы пытаетесь отобразить тогда.

У меня та же проблема, когда я использовал метод pop навигационного контроллера В моем приложении я использую отдельную логику для контроллера навигации, поэтому избегаю использования панели навигации, и она всегда скрыта. Затем я использую пользовательский вид и уведомление для обработки кнопки и ее событий. Уведомления наблюдателей зарегистрированы и не удалены. Таким образом, уведомление запускается дважды, и это создает вышеупомянутую ошибку. Тщательно проверьте код на наличие ошибок

У меня была эта проблема, когда я забыл установить Break; после нажатия на вид в операторе switch!

Как здесь:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

Одним из решений было бы,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

Это было трудно для меня: я переопределил

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

без переопределения:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

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

Вы можете столкнуться с этим, если попытаетесь закрыть UIViewController до его полной загрузки.

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

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

Причина ошибки "Несбалансированные вызовы для начала / окончания появления переходов" заключается в навигации | Segue дважды в то же время

В моем случае я собирался NSData от NSURL внутриviewDidLoadметод.

Другие вопросы по тегам