viewpager tutorial pageview page example control ios xcode uipageviewcontroller

ios - tutorial - Fallo de aserción en UIPageViewController



uipageviewcontroller swift 4 (5)

Al cambiar entre pestañas demasiado rápido en UIPageViewController, la aplicación se cuelga en línea

[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:]

con errores Error de aserción y aplicación de finalización debido a la excepción no detectada ''NSInternalInconsistencyException'', razón: ''No controlador de vista que administra la vista visible.

Registro de errores como a continuación

*** Assertion failure in -[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:], /SourceCache/UIKit/UIKit-3318.0.1/UIPageViewController.m:1875 2014-09-29 11:34:00.770 Wowcher[193:9460] *** Terminating app due to uncaught exception ''NSInternalInconsistencyException'', reason: ''No view controller managing visible view <UIView: 0x1783fa80; frame = (0 0; 320 416); autoresize = W+RM+H+BM; layer = <CALayer: 0x17898540>>'' *** First throw call stack: (0x219fbf87 0x2f15ac77 0x219fbe5d 0x226cb2c9 0x253f9fff 0x2546f8d3 0x2546f6b7 0x2546c2b9 0x254700db 0x25470f97 0x2546d037 0x24ea925f 0x2500a589 0x24ff7eef 0x24ea677d 0x252b8c81 0x24e70105 0x24e6e07f 0x24ea4b6d 0x24ea443d 0x24e7acc5 0x250ee513 0x24e79707 0x219c2807 0x219c1c1b 0x219c0299 0x2190ddb1 0x2190dbc3 0x28c99051 0x24ed9a31 0xd950b 0xca6e0) libc++abi.dylib: terminating with uncaught exception of type NSException

Gracias por adelantado


Aquí hay una discusión realmente buena:

Eliminar un controlador de vista de UIPageViewController

La respuesta aceptada discute esto:

"Al no saber exactamente por qué sucedía esto, di marcha atrás y eventualmente comencé a usar la respuesta de Jai como una solución, creando un UIPageViewController completamente nuevo, empujándolo a un UINavigationController , y luego sacando el anterior. Bruto, pero funciona, principalmente. He estado encontrando que sigo recibiendo fallas de aserción ocasionales de UIPageViewController , como esta:

  • Fallo de aserción en - [UIPageViewController queuingScrollView: didEndManualScroll: toRevealView: dirección: animated: didFinish: didComplete:], /SourceCache/UIKit_Sim/UIKit-2380.17/UIPageViewController.m:1820 $ 1 = 154507824 Controlador de vista que no gestiona la vista visible>

Y la aplicación falla. ¿Por qué? Bueno, buscando, encontré esta otra pregunta que mencioné arriba, y particularmente la respuesta aceptada que defiende mi idea original, de simplemente llamar a setViewControllers: animated:YES y luego tan pronto como termine llamando a setViewControllers: animated:NO con el mismo ver los controladores para reiniciar el UIPageViewController , pero tenía el elemento faltante: volver a llamar ese código en la cola principal! Aquí está el código: "


Así que mi solución a esto fue agregar un BOOL que realiza un seguimiento de mi estado de animaciones. Entonces, antes de configurar el nuevo ViewController , también lo ViewController :

if (!_transitionInProgress) { _transitionInProgress = YES; [self.pageController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:^(BOOL finished) { _transitionInProgress = !finished; }]; }

Así que esperaré a que mi animación termine antes de configurar un nuevo controlador de vista. En mi caso, tengo algunos botones que el usuario puede presionar para cambiar de página. Esto también les impide ir demasiado rápido a través de ellos para que las animaciones sean siempre suaves y agradables


Este es un error en la implementación interna de UIPageViewController en modo de desplazamiento. Sucede cuando se produce una animación de transición mientras el controlador de vista de página ya está animando una transición. Lo que terminé haciendo fue bloquear la interfaz de usuario de permitir múltiples pergaminos rápidos. Tengo dos botones, izquierdo y derecho, que hacen que el controlador de visualización de página se desplace al controlador de página anterior o siguiente. Desactivo la operación de los botones mientras hay una animación. El delegado del controlador de vista de página le dice todo lo que necesita saber cuando desea deshabilitar la funcionalidad de la UI y cuándo volver a habilitarla, una vez que todas las animaciones se hayan detenido.


También me estoy enfrentando a este problema, pero el problema es que no puedo reproducir el problema de forma coherente, pero puedo ver en los registros crash que existe el problema.

Tengo el pageviewcontroller que permite al usuario deslizar y también la vista se desplaza programáticamente. La aplicación falla a veces cuando ingresas a la pantalla, pero en los siguientes intentos funciona bien, por lo que es una locura. Incluso si pongo una solución, no puedo estar seguro de que funcione ya que no puedo reproducirla. Parece que el siguiente código debería arreglarlo (tomado de Eliminar un controlador de vista de UIPageViewController ) al menos la pantalla se comporta mejor con este código. Realmente apreciaría si puedo obtener algunos métodos para inyectar este bloqueo yo mismo, para que pueda verificar la solución.

- (void) setViewControllers:(NSArray*)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL))completion { if (!animated) { [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; return; } [super setViewControllers:viewControllers direction:direction animated:YES completion:^(BOOL finished){ if (finished) { dispatch_async(dispatch_get_main_queue(), ^{ [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; }); } else { if (completion != NULL) { completion(finished); } } }]; }


edgesForExtendedLayout = UIRectEdgeNone problema estableciendo edgesForExtendedLayout = UIRectEdgeNone en mi subclase UIPageViewController :

- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(NSDictionary<NSString *,id> *)options { self = [super initWithTransitionStyle:style navigationOrientation:navigationOrientation options:options]; self.edgesForExtendedLayout = UIRectEdgeNone; return self; }