2012-09-29 33 views
5

discúlpeme si mi pregunta puede sonar estúpida para algunos de ustedes. Soy relativamente nuevo en el desarrollo de iOS, pero tengo que portar una aplicación para iOS6. La aplicación funciona perfectamente en iOS 5 y XCode 4.3.2 pero estoy teniendo un error extraño con Xcode 4.5 en el simulador de iPhone 6.0. Después se carga la pantalla inicial que puede golpear cualquier botón que quiero, y me sale el error:Segue no funciona con iOS6

`Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'register'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.` 

El método prepareForSegue del StartScreenViewController se parece a esto

if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) { 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]]; 
    appDelegate.window.rootViewController = navController; 
} 

Establecer un punto de interrupción me muestra que El método todavía se llama corectly, pero después de que prepareForSegue finalice, la aplicación se bloquea con el error mencionado anteriormente. ¿Alguien podría señalarme en la dirección correcta?

Muchas gracias Martin

Respuesta

5

Debido a que usted está utilizando una Cacao push segueestá buscando un controlador de navegación ancestral en la jerarquía deStartScreenViewController.

  • Si encuentra uno, lo usará para empujar automáticamente un nuevo controlador de vista en la pila del controlador de navegación.
  • Como no encuentra uno, su aplicación se está cayendo.

prepareForSegue: existe para que usted pueda configurar un VC que está a punto de ser visualizado automáticamente por el IOS. No es su responsabilidad mostrar VC, que es lo que parece que está haciendo cuando configura window.rootViewController.

Es posible que desee leer a través de estos documentos: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

5

se puede decir "la aplicación funcionaba a la perfección", pero el hecho es que el código que usted cita era siempre muy mal, por lo que parece que esta equivocación es ahora está expuesto. Nunca debe cambiar el controlador de vista raíz de la ventana en el medio de la aplicación; deberías configurarlo una vez en el lanzamiento y nunca más. Y, como ha dicho Joshua con razón, prepararse para un cambio no es un momento para que te metas con la estructura de control de vista, que se segue a sí misma.

Tienes una canasta en tus manos. Puede ser una buena idea detenerse y comprender iOS y ver los controladores (y los guiones gráficos) antes de dar un paso más, ya que es posible que termine destruyendo toda la arquitectura de esta aplicación para poder hacerlo bien. Aquí es un poco de ayuda:

http://www.apeth.com/iOSBook/ch19.html

2

que tienen el mismo problema. La aplicación funciona bien en el dispositivo ios6, cuando se descarga de la tienda de aplicaciones, pero el mismo código no funciona ni en el dispositivo ni en el simulador. Problema muy extraño.

Mi estructura de aplicación es el siguiente:

NavigationController ->UIViewController (tiene PageControl, tienen varias páginas, horizontalmente desplazables) ->UITableViewController (representa una lista de noticias para una categoría), y cuando el usuario hace clic en una sola noticia, obtiene DetailsViewController (instancia de UIViewController).

Este es el código de prepareForSegue:

if ([[segue identifier] isEqualToString:@"ShowTelegrafDetails"]){ 
    TelegrafDetailsViewController *details = (TelegrafDetailsViewController*)segue.destinationViewController; 

    NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];  

    if([self isItPad]) 
     details.linkFromTableView = [[otherNews objectAtIndex:myIndexPath.row] link]; 
    else 
     details.linkFromTableView = [[[myViewController.itemMatrix objectAtIndex:[self calculateCurrentPage]] objectAtIndex:myIndexPath.row] link]; 

    NSLog(@"%@",segue.sourceViewController); 
    NSLog(@"%@",segue.destinationViewController); 

    [self.myViewController.navigationController pushViewController:details animated:YES]; 
    } 

Parece que el controlador de vista de origen se establece como se supone que es, i utilizar guiones gráficos y NavigationController se establece automáticamente. No sé si tengo que configurar RootViewController en algún lugar explícitamente, pero podría ser complicado configurarlo en AppDelegate, porque tengo dos jerarquías de vistas más entre el delegado y una clase que debería ser root (UITableViewController).

Si alguien sabe algo más sobre él estoy eternamente agradecido, de lo contrario podría usar algunas direcciones. He leído la documentación de Apple con respecto a este tema, pero no puedo entenderlo completamente cuando se trata de situaciones complejas.

Además, si no encuentro ninguna solución, con mucho gusto publicar aquí como un jefe. : D

Gracias de antemano.

EDIT:

he logrado solucionar este problema. Acaba de sacar segues, y poner el código de prepareForSegue en didSelectRowAtIndexPath, con las correcciones apropiadas. No es una solución ideal, pero soluciona el problema. Aunque tengo planes para admitir más de 4.3 dispositivos, y los guiones gráficos no son una opción en ese caso.

Además, he verificado el código, descubrí que RootViewController se creó y se muestra correctamente, NavigationController funciona bien y todavía no puedo entender por qué los continuos no funcionan.

Saludos.