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?
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?
Respostas:
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.
No meu caso, aconteceu quando acionei o método de [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
um UINavigationController
item viewDidLoad
.
Movê-lo para o viewDidAppear
método resolveu o problema.
A razão muito provável é que viewDidLoad
nem todas as animações extravagantes já foram concluídas, enquanto em viewDidAppear
tudo está feito.
Eu tenho esse problema tambem. Encontrei duas soluções para este problema:
UINavigationController
onde esse problema foi resolvido. Controlador de navegação com bufferVocê 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];
});
dispatch_async
fila 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];});
Eu tive muitos problemas com o mesmo problema. Eu resolvi isso desta maneira
1) Você não está usando o UIViewController's
inicializador designado initWithNibName:bundle:
. Tente usá-lo em vez de apenas init
.
2) definido animated:YES
como NÃO, e isso resolveu o problema. por exemplo.[self.navigationController pushViewController: viewController_Obj animated:NO];
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.
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
super.viewWillAppear()
dentro viewDidDisappear()
.
'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.
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;
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)
}
}
}
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.
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
Pelo que vale a pena, recebi o mesmo erro ao não incluir uma chamada para [super viewDidLoad:animated]
na minha viewDidLoad
substituição.
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:
Eu implementei uma lógica para esperar o envio de UIViewController
até 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 UIViewController
fosse empurrado duas vezes pelo UINavigationController
e deu este aviso.
Razão Para mensagem: Esta mensagem são exibidas se e somente se você está empurrando / apresentando outro controlador Vista viewWillAppear
, loadView
, init
ou viewDidLoad
método de corrente View Controller
Maneira de remover a mensagem de erro: Mova seu código de envio / apresentação para o viewDidAppear
método para resolver o problema
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)
}
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:
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];
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.
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.