Tengo este problema cuando simulo mi aplicación, no es un error ni una advertencia, pero aparece en mi consola, ¿alguien ha experimentado esto antes?
Tengo este problema cuando simulo mi aplicación, no es un error ni una advertencia, pero aparece en mi consola, ¿alguien ha experimentado esto antes?
Respuestas:
En mi caso, este error ocurre cuando hace clic en dos pestañas en una vista de tabla muy rápido.
El resultado causa un nombre de título incorrecto, el botón de retroceso desaparece. Alguien mencionó que cuando presionas una vista set animated:NO
,. El error desaparecerá pero seguirá provocando un comportamiento extraño. Empuja dos vistas, luego debe retroceder dos veces para volver a la pantalla de vista de tabla.
Método que probé para resolver este problema:
añadir BOOL cellSelected;
en viewWillAppear
cellSelected = YES;
en el delegado de didselectcell if (cellSelected){cellSelected = NO; do action ; }
Esto ayuda a evitar hacer clic muy rápido en dos celdas diferentes.
En mi caso sucedió cuando disparé [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
dentro UINavigationController
del viewDidLoad
método de un elemento .
Moverlo al viewDidAppear
método resolvió el problema.
La razón muy probable es que viewDidLoad
no todas las animaciones de fantasía ya se han terminado, mientras que en viewDidAppear
todo está hecho.
Tengo este problema también. Encontré dos soluciones a este problema:
UINavigationController
donde se resolvió este problema. Controlador de navegación con búferDebe ejecutar su código en un bucle diferente para evitar esto
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
cola principal. Lo que pasa dispatch_async
es que espera hasta que todas las demás animaciones de la cola principal estén listas. es mucho mejor que usar un retraso porque: 1- nunca sabrás si un retraso es suficiente, depende de tu dispositivo anfitrión 2- terminarás exagerando el retraso y algo se retrasará. prueba esto:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
Tuve muchos problemas con el mismo problema. Resolví esto de esta manera
1) No está utilizando el UIViewController's
inicializador designado initWithNibName:bundle:
. Intente usarlo en lugar de solo init
.
2) establecido animated:YES
en NO, y eso resolvió el problema. p.ej.[self.navigationController pushViewController: viewController_Obj animated:NO];
Tuve el mismo problema al usar el controlador de navegación y presionar otros controladores hacia él. Intenté usar el controlador de navegación con búfer y varios otros enfoques, pero no funcionó para mí. Después de pasar un tiempo para resolverlo, noté que este problema ocurre si intenta presionar un nuevo controlador de vista mientras la transacción anterior (animación) está en progreso (aproximadamente 0.5 segundos de duración, supongo). De todos modos, hice una solución rápida al delegar el controlador de navegación y esperar a que finalizara la animación anterior.
Asegúrese de no olvidar en -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear para llamar al método super adecuado en su sobrecarga de esos métodos. Por ejemplo, en mi caso, el nombre del método no coincide de esta manera:
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
observe que los métodos de aparecer y desaparecer no coinciden
super.viewWillAppear()
dentro viewDidDisappear()
.
'Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia para'
Dice que una animación se inicia antes de que no se complete la última animación relacionada. Entonces, ¿está abriendo algún controlador de vista antes de presionar el nuevo? ¿O puede estar saliendo a la raíz? Si es así, intente hacerlo sin animación, es decir[self.navigationController popToRootViewControllerAnimated:NO];
Y vea si esto resuelve el problema, en mi caso esto funcionó.
Recibí este problema porque estaba llamando a un UIPrintInteractionController desde un viewController sin UITabbar, y ni UINavigationBar. Parece que UIPrintInteractionController no obtuvo el printInteractionControllerParentViewController correcto. Implementar el método en el delegado y devolver el rootViewController actual funcionó para mí.
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
Tuve un problema similar que implicaba rebobinar los diálogos modales. Publicado la solución aquí ...
https://stackoverflow.com/a/38795258/324479
[Problema]
Controlador de navegación -> VC1 -Push -> VC2 -PopOver o Modal Segue -> VC3.
VC3 está volviendo a VC1.
Cuando la Segue de VC2 a VC3 es PopOver y Modal, la desconexión finaliza en una advertencia: Llamadas no balanceadas para comenzar / finalizar transiciones de apariencia para UIViewController "
Si se empuja Segue de VC a VC, la advertencia desaparece.
[Solución]
Sería genial si la lógica de relajación se encargara de esto. Quizás sea un error, quizás no. De cualquier manera, la solución es hacer que VC2 (el controlador que tiene la ventana emergente) sea el objetivo del rebobinado, luego esperar a que termine de aparecer antes de que aparezca el controlador de navegación. Eso asegura que la animación de rebobinado (ventana emergente inversa) tenga tiempo suficiente para terminar antes de retroceder más. Incluso con las animaciones apagadas, todavía tiene que esperar o, de lo contrario, obtendrá el error.
Su código para VC2 debería ser el siguiente. (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)
}
}
}
La situación puede ocurrir si está agregando una vista con un controlador de vista modal como una subvista. Mejor usar:
-(void) viewDidAppear:(BOOL)animated {
[self presentViewController:self.yourModalVC animated:YES completion:nil];
}
Básicamente, está diciendo que el ciclo de vida de la vista no está optimizado para los viewControllers que está tratando de mostrar en ese momento.
Tengo el mismo problema cuando utilicé el método pop de navigationcontroller En mi aplicación, uso una lógica separada para el controlador de navegación, así que evité el uso de la barra de navegación y siempre está oculta. Luego utilizo una vista personalizada y una notificación para manejar el botón trasero y sus eventos. los observadores de notificaciones se registran y no se eliminan. Entonces, la notificación se dispara dos veces y crea el error mencionado anteriormente. Verifique su código a fondo para obtener tales fallas
Por lo que vale, obtuve este mismo error al no incluir una llamada a [super viewDidLoad:animated]
en mi viewDidLoad
anulación.
También tuve este problema cuando presioné un botón de un NIB. Resulta que accidentalmente conecté el botón para enviar un evento a dos métodos IBAction, cada uno de los cuales hizo un pushViewController: animated:
Implementé alguna lógica para esperar presionando UIViewController
hasta que se descargaran todos los datos. Hubo un error en esta lógica que hizo que se empujara elUIViewController
demasiado pronto mientras aún había otra llamada a la API en curso.
Hizo que el mismo UIViewController
fuera empujado dos veces por el UINavigationController
y dio esta advertencia.
Razón por mensaje: Este mensaje a ser visualizado, si y sólo si usted está empujando / presentar otro controlador Vista desde viewWillAppear
, loadView
, init
o viewDidLoad
el método de la corriente Vista Controlador
Manera de eliminar el mensaje de error: mover su código de presentación / presentación al viewDidAppear
método resolverá el problema
Rápido 4
Mi problema era que estaba presentando otro VC antes de que el actual terminara de renderizarse.
La solución fue presentar mi nextVC después de un breve retraso.
LO QUE NO DEBE HACER
override func viewDidLoad() {
super.viewDidLoad()
self.present(MyNextVC(), animated: true, completion: nil)
}
LO QUE DEBE HACER
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)
}
Tuve este problema cuando me olvidé de configurar Break; después de presionar la vista en una declaración de cambio!
Como aquí:
case 1:{
SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];
}
break; //Forgetting to set break here:
una solución sería,
[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
Puede encontrarse con esto si intenta descartar un UIViewController antes de que termine de cargarse.
Tenía este mensaje en la consola y me estaba enfocando completamente en el UIViewController que presentaba el nuevo UIViewController, sin éxito. Finalmente descubrí que el problema estaba en el UIViewController que estaba presentando y se estaba descartando porque el usuario no había iniciado sesión en su cuenta.
Espero que esto ayude a alguien.
Este fue difícil para mí: he anulado
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
sin anular:
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
en mi controlador de navegación raíz de ventana. luego, un controlador de navegación para niños se quejó al presionar otro controlador de vista con la advertencia mencionada anteriormente. La advertencia no fue la peor, el gran problema fue que allí ya no se llamaba al delegado del controlador de navegación infantil. cansado.