Chamadas não balanceadas para iniciar / terminar transições de aparência para <FirstViewController: 0x2a2c00>


93

Eu tenho esse problema quando simulo meu aplicativo, não é um erro ou um aviso, mas aparece no meu console, alguém já experimentou isso antes?


você faz algum tipo de animação nesse controlador de visualização?

1
Sim. Eu tenho uma animação de abertura que desliza para imagens separadas. Agora percebi que esse erro só acontece quando estou carregando o código no telefone.
C.Johns

a mensagem de erro sugere que você comece uma transição, mas há uma chamada ausente para o método de término correspondente.

1
Tenho a mesma coisa. Alguma solução para isso?
seeafish

Também procurando uma solução para isso
barfoon

Respostas:


48

No meu caso, esse erro ocorre quando você clica em duas guias em um tableview muito rápido.

O resultado faz com que o titlename incorreto e o botão Voltar desapareça. Alguém mencionou que quando você empurra uma visualização set animated:NO,. O erro desaparecerá, mas ainda causará algum comportamento estranho. Ele empurra duas visualizações, então você precisa voltar duas vezes para voltar à tela tableview.

Método que tentei para resolver este problema:

adicionar BOOL cellSelected;

no viewWillAppear cellSelected = YES;

em didselectcell delegado if (cellSelected){cellSelected = NO; do action ; }

Isso ajuda a evitar clicar em duas células diferentes muito rapidamente.


5
Meu palpite é que parte do texto era difícil de entender. Fiz algumas edições para aumentar a legibilidade.
Kyle Clegg de

42

No meu caso, aconteceu quando acionei o método de [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];um UINavigationControlleritem viewDidLoad.

Movê-lo para o viewDidAppearmétodo resolveu o problema.

A razão muito provável é que viewDidLoadnem todas as animações extravagantes já foram concluídas, enquanto em viewDidAppeartudo está feito.


Obrigado. Eu me perdi na era dos homens das cavernas, onde estava criando cada um dos elementos da IU através do código. Coisas de storyboard são novas para mim.
Kiran Kulkarni,


15

Você deve executar seu código em um loop diferente para evitar isso

 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
Uma ideia melhor é colocar a animação de apresentação dentro de uma dispatch_asyncfila principal. O problema dispatch_asyncé que ele espera até que todas as outras animações na fila principal sejam concluídas. é muito melhor do que usar um atraso porque: 1- você nunca saberá se um atraso é suficiente, depende do seu dispositivo host 2- você acabará exagerando no atraso e algo vai demorar. tente isto:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

Eu tive muitos problemas com o mesmo problema. Eu resolvi isso desta maneira

1) Você não está usando o UIViewController'sinicializador designado initWithNibName:bundle:. Tente usá-lo em vez de apenas init.

2) definido animated:YEScomo NÃO, e isso resolveu o problema. por exemplo.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

Tive o mesmo problema ao usar o controlador de navegação e enviar outros controladores a ele. Tentei usar o Buffered Navigation Controller e várias outras abordagens, mas não funcionou para mim. Depois de gastar algum tempo para descobrir isso, percebi que esse problema ocorre se você tentar empurrar o novo controlador de visualização enquanto a transação anterior (animação) em andamento (cerca de 0,5 segundos de duração, eu acho). De qualquer forma, fiz uma solução rápida delegando controlador de navegação e aguardando o final da animação anterior.


Obrigado! Mover minha lógica para viewDidAppear ajudou na minha situação.
Jaroslav

7

Certifique-se de não se esquecer de -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear para chamar o super método adequado em sua sobrecarga desses métodos. Por exemplo, no meu caso, eu não correspondi ao nome do método como este:

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

Observe que os métodos de aparecer e desaparecer são incompatíveis


Acabei de passar cerca de duas horas depurando esse problema e isso é o que aconteceu. Chamando super.viewWillAppear()dentro viewDidDisappear().
Daniel Wood

Obrigado por esta dica. Não foi meu único problema, mas ajudou!
Anthony C

4

'Chamadas desequilibradas para iniciar / terminar transições de aparência para'

Diz que uma animação é iniciada antes que a última animação relacionada não seja concluída. Então, você está abrindo qualquer controlador de visualização antes de enviar o novo? Ou pode estar tentando enraizar? se sim, tente fazer isso sem animação, ou seja[self.navigationController popToRootViewControllerAnimated:NO];

E veja se isso resolve o problema, No meu caso, funcionou.


1
Esta é a chave: pop ou altere outras transições do viewcontroller ao mesmo tempo.
Rocky

2

Eu tenho esse problema porque estava chamando um UIPrintInteractionController de um viewController sem UITabbar e nem UINavigationBar. Parece que o UIPrintInteractionController não obteve o printInteractionControllerParentViewController correto. Implementar o método no delegado e retornar o rootViewController atual funcionou para mim.

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

2

Eu tive um problema semelhante que envolveu o retrocesso de diálogos modais. Postei a solução aqui ...

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

[Problema]

Controlador de Nav -> VC1 -Push -> VC2 -PopOver ou Segue Modal -> VC3.

O VC3 está voltando ao VC1.

Quando o segmento de VC2 para VC3 é PopOver e Modal, o desenrolamento termina em um aviso: Chamadas não balanceadas para iniciar / encerrar transições de aparência para UIViewController "

Se o segmento de VC para VC for empurrado, o aviso desaparece.

[Solução]

Seria ótimo se a lógica do desenrolamento cuidasse disso. Talvez seja um bug, talvez não. De qualquer forma, a solução é tornar VC2 (o controlador que possui o pop-up) o destino do retrocesso e, em seguida, esperar que ele termine de aparecer antes de abrir o controlador de navegação. Isso garante que a animação de retrocesso (pop-up reverso) tenha tempo suficiente para terminar antes de retroceder. Mesmo com as animações desligadas, ainda tem que esperar senão você obterá o erro.

Seu código para VC2 deve ser o seguinte. (Rápido)

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

A situação pode ocorrer se você estiver adicionando uma visualização com um controlador de visualização modal como uma visualização secundária. Melhor usar:

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

Basicamente, está dizendo que o ciclo de vida da visualização não é otimizado para os viewControllers que você está tentando exibir.


1

Tenho o mesmo problema ao tentar fazer:

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

em uma função como - (void) popUpToLevelTwo;, e colocar um return;no final da função resolve o problema


1

Eu também tenho isso em

[self dismissModalViewControllerAnimated:YES];

Mudei o YESpara um NOe isso resolveu o problema.


1

Eu tenho o mesmo problema quando usei o método pop do Navigationcontroller No meu aplicativo eu uso uma lógica separada para o controlador de navegação, então evitei o uso da barra de navegação e ela está sempre escondida. Então eu uso um modo de exibição personalizado e notificação para lidar com o botão de fundo e seus eventos. observadores de notificação são registrados e não removidos. Portanto, a notificação é disparada duas vezes e cria o erro mencionado acima. Verifique seu código minuciosamente para obter tais falhas


1

Pelo que vale a pena, recebi o mesmo erro ao não incluir uma chamada para [super viewDidLoad:animated]na minha viewDidLoadsubstituição.


1
talvez você queira dizer viewDidAppear? viewDidLoad não tem parâmetros
Fabio Napodano

1

Eu também tive esse problema quando toquei em um botão de um NIB. Acontece que eu acidentalmente conectei o botão para enviar um evento a dois métodos IBAction, cada um dos quais executou um pushViewController: animado:


Obrigado !! você economiza meu tempo !!
VD

1

Eu implementei uma lógica para esperar o envio de UIViewControlleraté que todos os dados fossem baixados. Houve um erro nesta lógica que fez com que oUIViewController muito cedo enquanto havia outra chamada de API em andamento.

Fez com que o mesmo UIViewControllerfosse empurrado duas vezes pelo UINavigationControllere deu este aviso.


1

Razão Para mensagem: Esta mensagem são exibidas se e somente se você está empurrando / apresentando outro controlador Vista viewWillAppear, loadView, initou viewDidLoadmétodo de corrente View Controller

Maneira de remover a mensagem de erro: Mova seu código de envio / apresentação para o viewDidAppearmétodo para resolver o problema


1

Swift 4

Meu problema era que eu estava apresentando outro VC antes que o atual terminasse de ser renderizado.

A solução foi apresentar meu nextVC após um rápido atraso.

O QUE VOCÊ NÃO DEVE FAZER

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

O QUE VOCÊ DEVERIA FAZER

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
Em vez de usar um atraso, eu colocaria o código em viewDidAppear ou viewDidLayoutSubviews.
Pranav Kasetti

0

Eu tive esse problema quando me esqueci de definir Break; depois de inserir a visualização em uma instrução switch!

Como aqui:

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

a razão por trás do erro "Chamadas não balanceadas para iniciar / encerrar transições de aparência" é quando você navega | segue duas vezes ao mesmo tempo


0

uma solução seria,

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

0

Você pode se deparar com isso se tentar dispensar um UIViewController antes de terminar de carregar.

Eu tinha essa mensagem no console e estava me concentrando inteiramente no UIViewController que apresentava o novo UIViewController, sem sucesso. Eu finalmente descobri que o problema estava no UIViewController que eu estava apresentando e estava se fechando porque o usuário não estava conectado à conta.

Espero que isso ajude alguém.


0

Esta foi uma pergunta difícil para mim: eu ignorei

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

sem substituir:

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

no meu controlador de navegação raiz da janela. então, um controlador de navegação infantil reclamou ao empurrar outro controlador de visualização com o aviso mencionado acima. O aviso não era dos piores, o grande problema era que ali não era mais chamado o delegado do controlador de navegação infantil. weired.


0

No meu caso eu estava buscando NSDataa partir de NSURLdentro ' viewDidLoad' método.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.