"Несбалансированные вызовы для начала / окончания переходов внешнего вида для DetailViewController" при нажатии более одного контроллера детального вида


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

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

у меня есть проблема, которая проявляется, когда два уведомления истекают одновременно, что приводит к неправильному отображению представлений и, кроме того, журналам консоли: "Несбалансированные вызовы для начала / окончания переходов внешнего вида для NNN", где NNN-мой контроллер подробного представления.

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

 self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil];
 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
 self.window.rootViewController = navController;

когда локальное уведомление истекает и didreceivelocalnotification: вызывается приложение передает уведомление с помощью nsnotifcationcenter postNotificationName: и к которому контроллер представления таблицы прослушивает. Когда контроллер табличного представления получает это уведомление, он создает контроллер подробного представления и помещает его в стек как:

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

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

поэтому я изменил push-код на этот:

[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];

но это не имело никакого значения.

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

[[NSNotificationCenter defaultCenter] postNotificationName: 

до

[[NSNotificationQueue defaultQueue] enqueueNotification: postingStyle:NSPostWhenIdle]

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

double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [[self.navigationController topViewController].navigationController     pushViewController:detailController animated:YES]; 
});

Я понятия не имею, в чем проблема или что предпринять, какие-то идеи?

9 57
ios

9 ответов:

"неуравновешенный вызовы begin и End возникновение переходы"

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

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

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

'несбалансированные вызовы для начала / окончания переходов внешнего вида для'

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

[self.navigationController popToRootViewControllerAnimated:NO];

и посмотреть, если это решает проблему, в моем случае это сработало.

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

Итак, вы должны быть уверены, что вы не представите новый VC, пока первый не закончит свою анимацию.

используйте didShowViewController и willShowViewController, чтобы заблокировать представление нового VC до того, как старый завершит свою анимацию. Это для backButtonAction, который делает popViewController с помощью Анимация: да.

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self.myNavView.backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [self.myNavView.backButton removeTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
}

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

на самом деле вам нужно подождать, пока не закончится анимация толчка. Таким образом, вы можете делегировать 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];
    }
}

в моем случае, я реализовывал пользовательский контроллер вида контейнера, и я получал предупреждение при замене дочерних контроллеров просмотра, несмотря на то, что я звонил иbeginAppearanceTransition(_:animated:)иendAppearanceTransition() как на входном, так и на выходном контроллерах вида.

Я решил это с помощью изменение порядка вызовов методов на задание контроллер представления ; от кого:

addChildViewController(newContent)
targetContainer.insertSubview(newContent.view, at: 0)

newContent.beginAppearanceTransition(true, animated: animated)
// Called AFTER adding subview 

to:

// Called BEFORE adding subview 
newContent.beginAppearanceTransition(true, animated: animated)

addChildViewController(newContent)
targetContainer.insertSubview(newContent.view, at: 0)

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

смотреть на эти перегрузки:

если они пусты, то отметьте их и перестроить.

- (void) beginAppearanceTransition:(BOOL) isAppearing animated:(BOOL)animated {}
- (void) becomeActive:(NSNotification *) notification {}

в моем случае проблема заключается в том, что я представляю viewController (alert) на уже представленном viewController (полноэкранный лист). UIKit идет вверх по родительской цепочке viewController, но не по цепочке представления, поэтому существует несоответствие при достижении представленного и корневого контроллера представления окна. Вызов вручную beginAppearanceTransition в этих случаях сообщение исчезло, хотя это кажется скорее патчем для симптома, чем реальным средством для исправления ошибки.

вы используете функцию внешнего вида прокси?

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

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

Я решил его удаление [[UITextField appearance] ..] методы.

надеюсь, что это помогает