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


93

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


вы делаете какую-то анимацию в этом контроллере представления?

1
Да. У меня есть открывающая анимация, которая перемещается к изображениям, теперь я заметил, что эта ошибка возникает только тогда, когда я загружаю код на телефон.
C.Johns

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

1
Получил то же самое. Любое решение для этого?
seeafish

Также ищу решение этой
проблемы

Ответы:


48

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

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

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

Добавить BOOL cellSelected;

в viewWillAppear cellSelected = YES;

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

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


5
Я предполагаю, что некоторые формулировки было трудно понять. Я сделал несколько правок, чтобы улучшить читаемость.
Кайл Клегг

42

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

Перенос его в viewDidAppearметод решил проблему.

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


Спасибо. Я потерялся в эпоху пещерных людей, когда создавал код каждого элемента пользовательского интерфейса. Раскадровка для меня в новинку.
Киран Кулкарни


15

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

 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];
        });

7
Лучшая идея - заключить представляющую анимацию в dispatch_asyncглавную очередь. Дело в том, dispatch_asyncчто он ждет, пока все остальные анимации в основной очереди не будут выполнены. это намного лучше, чем использование задержки, потому что: 1 - вы никогда не узнаете, достаточно ли задержки, это зависит от вашего хост-устройства; 2 - вы в конечном итоге переусердствуете с задержкой, и что-то будет отставать. попробуйте это:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

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

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

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


7

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


Спасибо! Перенос моей логики на viewDidAppear помог в моей ситуации.
Ярослав

7

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

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

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


Просто потратил около двух часов на отладку этой проблемы, и вот как она оказалась. Звонок super.viewWillAppear()внутри viewDidDisappear().
Дэниел Вуд

Спасибо за этот совет. Это была не единственная моя проблема, но это помогло!
Anthony C

4

«Несбалансированные вызовы для начала / завершения смены появления для»

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

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


1
Это ключ: вставлять или изменять другие переходы контроллера представления одновременно.
Rocky

2

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

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

2

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

https://stackoverflow.com/a/38795258/324479

[Проблема]

Контроллер навигации -> VC1 -Push -> VC2 -PopOver или Modal Segue -> VC3.

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

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

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

[Решение]

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

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

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)
        }
    }
}

1

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

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

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


1

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

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

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


1

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

[self dismissModalViewControllerAnimated:YES];

Я изменил на YESa NO, и это решило проблему.


1

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


1

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


1
ты может иметь ввиду viewDidAppear? viewDidLoad не имеет параметров
Фабио Наподано

1

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


Благодарность !! вы экономите мое время !!
VD

1

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

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


1

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

Способ удаления сообщения об ошибке: переместите код отправки / представления в viewDidAppearметод, который решит проблему


1

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)
}

4
Вместо использования задержки я бы поместил код в viewDidAppear или viewDidLayoutSubviews.
Пранав Касетти

0

У меня была эта проблема, когда я забыл установить 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:

0

причина ошибки «Несбалансированные вызовы для начала / окончания переходов внешнего вида» - когда вы переходите | переходить дважды одновременно


0

одно решение было бы,

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

0

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

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

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


0

Для меня это было непросто: я переопределил

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

без отмены:

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.