2012-09-29 15 views
5

scusami se la mia domanda può sembrare stupida per alcuni di voi. Sono relativamente nuovo per lo sviluppo iOS, ma devo portare un'app per iOS6. L'app funziona perfettamente su iOS 5 e XCode 4.3.2, ma ho un bug strano con Xcode 4.5 sul simulatore di iPhone 6.0. Dopo la schermata iniziale, viene caricato posso colpire qualsiasi pulsante che voglio, e ottengo l'errore:Segue non funziona 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.` 

Il metodo prepareForSegue del StartScreenViewController assomiglia a questo

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

Impostare un punto di interruzione mi dimostra che il metodo viene ancora chiamato correttamente, ma dopo che il file PreparForSegue è terminato, l'app si arresta in modo anomalo con l'errore precedente. Qualcuno potrebbe indicarmi la giusta direzione?

ringrazio molto Martin

risposta

5

Perché stai usando un cacao push segueè alla ricerca di un controller di navigazione ancestrale nella gerarchia di StartScreenViewController.

  • Se ne trova uno, verrà utilizzato per spingere automaticamente un nuovo controller di visualizzazione sullo stack del controller di navigazione.
  • Poiché non lo trova, l'app si arresta in modo anomalo.

prepareForSegue: esiste per voi per configurare un VC che sta per ottenere automaticamente visualizzato da iOS. Non è tua responsabilità di visualizzare VC, che è ciò che sembra fare quando imposti window.rootViewController.

Si consiglia di leggere questi documenti: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

5

si può dire "l'applicazione stava funzionando perfettamente", ma il fatto è che il codice lei cita è sempre stato molto male, in modo da sembrare che questa scorrettezza è ora esposto Non si dovrebbe mai cambiare il controller della vista radice della finestra nel mezzo dell'app; dovresti impostarlo una volta al momento del lancio e mai più. E, come giustamente ha detto Giosuè, prepararsi per un seguito non è il momento per voi di pasticciare con la struttura del controller della vista, che il seguito stesso sta per confondere.

Hai una custodia da viaggio sulle tue mani. Potrebbe essere una buona idea per te smettere e capire iOS e visualizzare i controller (e gli storyboard) prima di fare un altro passo, dal momento che potresti finire con lo strappo dell'intera architettura di questa app per farlo funzionare correttamente. Ecco qualche aiuto:

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

2

Ho lo stesso problema. L'app funziona bene sul dispositivo ios6, quando viene scaricato dall'app store, ma lo stesso codice non funziona né sul dispositivo né sul simulatore. Problema molto strano

La mia struttura app è la seguente:

navigationController ->UIViewController (ha PageControl, tengono più pagine, in senso orizzontale scorrevoli) ->UITableViewController (rappresenta una lista delle notizie per una categoria), e quando l'utente fa clic su una singola notizia, ottiene DetailsViewController (istanza di UIViewController).

Questo è il codice da 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]; 
    } 

Sembra che controller della vista sorgente è impostato come si suppone, i uso storyboard e navigationController viene impostata automaticamente. Non so se devo impostare RootViewController da qualche parte in modo esplicito, ma potrebbe essere difficile impostarlo in AppDelegate, perché ho ancora due gerarchie di viste tra delegate e una classe che dovrebbe essere root (UITableViewController).

Se qualcuno sa qualcosa di più, sono eternamente grato, altrimenti potrei usare alcune indicazioni. Ho letto la documentazione di Apple su questo argomento, ma non riesco a capirlo completamente quando si tratta di situazioni complesse.

Inoltre, se trovo una soluzione, la inserirò volentieri qui come un capo. : D

Grazie in anticipo.

EDIT:

sono riuscito a risolvere questo problema. Appena rimosso segues, e inserire il codice da prepareForSegue in didSelectRowAtIndexPath, con le correzioni appropriate. Non è una soluzione ideale, ma risolve il problema. Anche se, ho in programma di supportare 4.3+ dispositivi, e gli storyboard non sono un'opzione in questo caso.

Inoltre, ho ricontrollato il codice, ho scoperto che RootViewController è stato creato e visualizzato correttamente, NavigationController funziona bene e non riesco ancora a capire perché i follower non funzionino.

Cheers.

Problemi correlati