Неврівноважені дзвінки для початку / закінчення переходів для <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 - ви ніколи не дізнаєтесь, чи достатньо затримки, це залежить від вашого хост-пристрою, - ви в кінцевому підсумку перестараєтеся із затримкою і щось буде відставати. спробуйте так:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
М. Пороошані

12

У мене було дуже багато проблем з тим же питанням. Я вирішив це таким чином

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

2) встановлено animated:YESзначення NO, і це вирішило проблему. напр.[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().
Даніель Вуд

Дякую за цю пораду. Це була не єдина моя проблема, але це допомогло!
Ентоні C

4

"Неврівноважені дзвінки для початку / закінчення переходів для"

Каже, що анімація запускається до того, як остання пов’язана анімація не буде виконана. Отже, ви вискакуєте будь-який контролер перегляду, перш ніж натискати на новий? Або може вискакувати корінь? якщо так, спробуйте зробити це без анімації, тобто[self.navigationController popToRootViewControllerAnimated:NO];

І подивіться, чи це вирішує проблему. У моєму випадку це зробило трюк.


1
Це ключ: одночасно відкривати або змінювати інші переходи диспетчера.
Rocky

2

У мене виникла ця проблема, тому що я викликав UIPrintInteractionController з viewController без UITabbar, а також UINavigationBar. Здається, що UIPrintInteractionController не отримав правильного друкуInteractionControllerParentViewController. Реалізація методу в делегаті та повернення поточного rootViewController працював на мене.

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

2

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

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

[Проблема]

Nav Controller -> VC1 -Push -> VC2 -PopOver або Modal Segue -> VC3.

VC3 повертається до VC1.

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

Якщо Segue від 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];

Я змінив YESна "a" NO, і це вирішило проблему.


1

У мене є така ж проблема, коли я використовував поп-метод навігаційного контролера. У своїй програмі я використовую окрему логіку для навігаційного контролера, тому уникаю використання панелі навігації, і це завжди приховано. Тоді я використовую спеціальний перегляд та сповіщення для обробки зворотної кнопки та її подій. спостерігачі сповіщення реєструються та не видаляються. Тож повідомлення сповіщається двічі, і це створює згадану вище помилку. Ретельно перевіряйте свій код на наявність таких несправностей


1

Оскільки це варте, я отримав цю саму помилку, коли не включив дзвінок [super viewDidLoad:animated]у свою viewDidLoadпереоцінку.


1
ви, можливо, маєте на увазі viewDidAppear? viewDidLoad не має параметрів
Fabio Napodano

1

У мене також була ця проблема, коли я натиснув кнопку від NIB. Виявляється, я випадково підключив кнопку для надсилання події до двох методів IBAction, кожен з яких виконував pushViewController: animated:


Дякую !! ти економиш мій час !!
VD

1

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

Це спричинило те, що UIViewControllerдва рази натиснули на це, UINavigationControllerі дало це попередження.


1

Причина для повідомлення: Це повідомлення відображається , якщо отримати і тільки тоді , коли ви штовхання / представляючи інший контролер Віда з viewWillAppear, loadView, initабо viewDidLoadметодом поточного View Controller

Спосіб видалення повідомлення про помилку: Перемістіть свій притискаючий / подаючи код до viewDidAppearметоду, це вирішить проблему


1

Швидкий 4

Моє питання полягало в тому, що я представляв ще один ВК до того, як мій поточний закінчився.

Рішення полягало в тому, щоб після швидкої затримки представити свій наступний ВК.

ЩО ВАМ НЕ ЗРОБИТИ

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

1
Замість того, щоб використовувати затримку, я ставлю код у 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
}

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.