2012-10-08 32 views
5

Cuando el usuario está en la primera página de UIPageViewController y trata de regresar, simplemente devuelvo nulo. En iOS 5, esto funciona bien. Está causando un bloqueo en iOS 6.Cómo configurar la primera página en UIPageViewController

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The number of view controllers provided (0) doesn't match the number required (1) for the requested transition' 

Aquí está mi código. Al devolver contentViewController en lugar de nil, funciona bien. ¿Qué debería poner en lugar de nil?

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController 
    viewControllerBeforeViewController:(UIViewController *)viewController { 

    contentViewController = [[ContentViewController_iPhone alloc] init]; 

    int currentIndex = [self.modelArray indexOfObject:[(ContentViewController_iPhone *)viewController labelContents]]; 

    if ((currentIndex == 0) || (currentIndex == NSNotFound)) { 

     //if on the first page, can't go back 
     return nil; 

    } 

    contentViewController.labelContents = [self.modelArray objectAtIndex:currentIndex - 1]; 

    return contentViewController; 

} 
+0

¿Puedes simplemente devolver 'self' en lugar de' nil'? Esto es conjetura de mi parte. –

+0

@JoshuaSmith Lo intenté, pero sigo teniendo el mismo problema. Gracias sin embargo. –

+0

La devolución 'nil' es exactamente la forma en que la plantilla del proyecto" Aplicación basada en la página "de Apple maneja la primera y la última página. Creo que tienes otro problema. Establezca un punto de interrupción de excepción y publique la ruta de pila completa de la excepción. –

Respuesta

10

Tuve el mismo problema y descubrí que solo sucede si cambio los delegados de la páginav iewcontrollers gestureRecognizers a mi propio controlador (esto se hace a menudo si desea cancelar la búsqueda cuando un usuario toca ciertas áreas en la página, p. botones).

Para mí funcionó no hacer esta reasignación para iOS 6. Esto está bien, ya que iOS maneja toques un poco diferentes. Los botones o sus propios reconocedores de gestos en la página funcionarán correctamente en iOS 6 ya que tienen prioridad y cancelarán la búsqueda automática.

Espero que esto ayude.

+0

Lo intentaré más tarde. Dijiste que los botones y mis propios reconocedores de gestos tendrán prioridad en iOS 6 ... ¿es esto también un cambio de iOS 5? Gracias. –

+0

@Jack: sí, creo que es un cambio (y la razón por la que creo que el viejo enfoque ya no es necesario en la mayoría de los casos) –

+0

Acabo de tener la oportunidad de probar esto y funcionó. ¡Gracias! –

0

es necesario agregar lo siguiente a su código

if (currentIndex == 0 || (index == NSNotFound)) { 

    //if on the first page, can't go back 
    return nil; 

} 
+0

Lo siento, eso no funcionó. Todavía se cuelga. Devolver 'nil' es el problema. No le gusta por alguna razón. La instrucción if no necesita ser cambiada. –

+0

¿Puedes poner un punto de interrupción en cero y verificar si está incluso ingresando a este bloque? –

+0

Es, utilicé un 'NSLog' antes y salió su contenido. Una vez más, todo esto funcionó bien en iOS 5. Es iOS 6 que está causando problemas. –

0

La última versión de Xcode aplicación basada en Página plantilla proporciona el siguiente código:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
    return nil; 
} 

index--; 
return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

Que debe hacer el truco: -)

+0

Gracias, pero eso no funcionó. La devolución 'nil' causa el problema. Cuando devuelvo un valor que no sea 'nil', funciona bien. ¿Cómo evito que vaya a la página antes de la primera página si nil no funciona? –

Cuestiones relacionadas