Li SO sobre outro usuário que encontrou um erro semelhante , mas esse erro ocorre em um caso diferente.
Recebi esta mensagem quando adicionei um View Controller inicialmente:
Unbalanced calls to begin/end appearance transitions for
<UITabBarController: 0x197870>
A estrutura do aplicativo é a seguinte:
Eu tenho um TabBarController de 5 guias vinculado a 5 controladores de visualização. Na guia de exibição inicial, chamo um novo View Controller para sobrepor como uma introdução ao aplicativo.
Eu uso este código para chamar o controlador de visualização de introdução:
IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release];
Após este IntroVC
controlador de visualização aparecer, o erro acima será mostrado.
ps Estou usando o xCode 4.2 e iOS 5.0 SDK, desenvolvendo o aplicativo iOS 4.3.
ios
ios4
uitabbarcontroller
Raptor
fonte
fonte
Respostas:
Sem ver mais do código circundante, não posso dar uma resposta definitiva, mas tenho duas teorias.
Você não está usando
UIViewController
o inicializador designado deinitWithNibName:bundle:
. Tente usá-lo em vez de apenasinit
.Além disso,
self
pode ser um dos controladores de visualização do controlador da barra de guias. Sempre apresente controladores de visualização do controlador de visualização superior, o que significa, neste caso, pedir ao controlador da barra de guias para apresentar o controlador de visualização de sobreposição em nome do controlador de visualização. Você ainda pode manter qualquer delegado de retorno de chamada para o controlador de exibição real, mas deve ter o controlador da barra de guias presente e dispensar.fonte
Corrigi esse erro alterando animado de SIM para NÃO.
De:
Para:
fonte
Postado por danh
Você pode gerar esse aviso apresentando o vc modal antes que a inicialização do aplicativo seja concluída. ou seja, inicie um aplicativo de modelo de aplicativo com guias e apresente um vc modal no topo de self.tabBarController como a última linha no aplicativo: didFinishLaunching. Aviso aparece. Solução: deixe a pilha se desenrolar primeiro, apresente o modal vc em outro método, invocado com um performSelector withDelay: 0.0
Tente mover o método para viewWillAppear e guarde-o para que seja executado apenas uma vez (recomendaria configurar uma propriedade)
fonte
viewWillAppear
e nãoviewDidAppear
?Outra solução para muitos casos é garantir que a transição entre
UIViewController
s aconteça após o procedimento não adequado (como durante a inicialização) terminar, fazendo:Isso é geral para também
pushViewController:animated:
etc.fonte
Eu tive o mesmo problema. Eu chamei um método
viewDidLoad
dentro do meu primeiroUIViewController
Dentro do segundo
UIViewController
fiz o mesmo também com 0,5 segundos de atraso. Depois de alterar o atraso para um valor mais alto, funcionou bem. É como se a sequência não pudesse ser realizada muito rápido após outra sequência.fonte
viewDidAppear
para queUINavigationController
esteja pronto para lidar com isso. Mudei minha postagem para esta;)Tive o mesmo problema quando preciso apresentar meu Login View Controller de outro View Controller. Se o usuário não estiver autorizado, fiz isso no método ViewDidLoad de meu outro View Controller (se não autorizado -> presentModalViewController). Quando comecei a fazer no método ViewDidAppear, resolvi esse problema. Acho que o ViewDidLoad inicializa apenas as propriedades e depois disso o algoritmo de exibição real começa! É por isso que você deve usar o método viewDidAppear para fazer transições modais!
fonte
Tive este problema devido a um erro de digitação:
ao invés de
Ele estava chamando "WillAppear" no super em vez de "DidAppear"
fonte
Eu tive muitos problemas com o mesmo problema. Eu resolvi este por
Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
[self.tabBarController presentModalViewController : vc animated:YES];
Eu tenho o viewcontroller no meu storyboard, por algum motivo, usar only
[[introvc alloc] init];
não funcionou para mim.fonte
Eu resolvi escrevendo
fonte
Tive este problema com um código de terceiros. Alguém se esqueceu de definir o super dentro de viewWillAppear e viewWillDisappear em uma classe TabBarController personalizada.
fonte
Se você estiver usando
transitioningDelegate
(não é o caso no exemplo desta pergunta), defina tambémmodalPresentationStyle
como.Custom
.Rápido
fonte
Eu tive o mesmo erro. Eu tenho uma barra de guias com 3 itens e estava inconscientemente tentando chamar o controlador de visualização raiz do item 1 no item 2 da minha barra de guias usando
performSegueWithIdentifier
.O que acontece é que ele chama o controlador de visualização e volta ao controlador de visualização raiz do item 2 após alguns segundos e registra esse erro.
Aparentemente, você não pode chamar o controlador de visualização raiz de um item para outro item.
Então, em vez de
performSegueWithIdentifier
eu usei
[self.parentViewController.tabBarController setSelectedIndex:0];
Espero que isso ajude alguém.
fonte
Tive o mesmo problema e pensei em postar caso alguém encontrasse algo parecido.
No meu caso, anexei um reconhecedor de gestos para pressionar longamente ao meu UITableViewController.
Em meu seletor onLongPress, iniciei meu próximo controlador de visualização.
No meu caso, recebi a mensagem de erro porque o reconhecedor de pressionamento longo disparou mais de uma vez e, como resultado, meu "SomeViewController" foi colocado na pilha várias vezes.
A solução foi adicionar um booleano para indicar quando SomeViewController havia sido colocado na pilha. Quando o método viewWillAppear do meu UITableViewController foi chamado, eu defini o booleano de volta para NÃO.
fonte
Descobri que, se você estiver usando um storyboard, deverá colocar o código que está apresentando o novo controlador de visualização em viewDidAppear. Ele também eliminará o aviso "Não é recomendado apresentar controladores de visualização em controladores de visualização desconectados".
fonte
No Swift 2+ para mim funciona:
Tenho UITabBarViewController no storyboard e selecionei a propriedade Index como esta:
Mas eu o excluo e adiciono meu método viewDidLoad da minha classe inicial, assim:
Espero poder ajudar alguém.
fonte
Na verdade, você precisa esperar até que a animação push termine. Assim, você pode delegar UINavigationController e evitar o push até que a animação termine.
fonte
Como @danh sugeriu, meu problema era que eu estava apresentando o modal vc antes que ele
UITabBarController
estivesse pronto. No entanto, eu me senti desconfortável em confiar em um atraso fixo antes de apresentar o controlador de visualização (em meus testes, precisei usar um atraso de 0,05-0,1sperformSelector:withDelay:
). Minha solução é adicionar um bloco que é chamado deUITabBarController
'sviewDidAppear:
método:PRTabBarController.h:
PRTabBarController.m:
Agora em
application:didFinishLaunchingWithOptions:
fonte
você precisa certificar-se de que - (void) beginAppearanceTransition: (BOOL) isAppearing animated: (BOOL) animated e - (void) endAppearanceTransition é criado junto na classe.
fonte
Eu tive o mesmo problema. Ao desenvolver, queria ignorar as telas. Eu estava navegando de um controlador de visualização para outro em viewDidLoad chamando um método seletor.
O problema é que devemos deixar o ViewController terminar a transição antes de fazer a transição para outro ViewController.
fonte
Swift 5
fonte
Tive esse problema quando naveguei do TVC raiz para o TVC A e depois para o TVC B. Depois de tocar no botão "carregar" no TVC BI, quis voltar direto para o TVC raiz (não há necessidade de revisitar o TVC A, então por que fazer isso) . Eu tinha:
... que gerou o erro "Chamadas não balanceadas para iniciar / encerrar etc". O seguinte corrigiu o erro, mas nenhuma animação:
Esta foi minha solução final, sem erros e ainda animada:
fonte
Eu encontrei esse erro quando conectei um UIButton a uma ação segue de storyboard (em IB), mas depois decidi fazer com que o botão chamasse programaticamente,
performSegueWithIdentifier
esquecendo de remover o primeiro do IB.Em essência, ele executou a chamada segue duas vezes, deu esse erro e realmente empurrou meu ponto de vista duas vezes. A correção foi remover uma das chamadas de segue.
Espero que isso ajude alguém tão cansado quanto eu!
fonte