2012-03-13 10 views
10

Nella nostra applicazione iOS con tre UIViewController s uno dopo l'altro, vorremmo saltare quello intermedio in base ad alcune condizioni e passare direttamente dal primo al terzo. Tuttavia, l'utente dovrebbe essere in grado di tornare al secondo tramite il pulsante "Indietro" sul terzo controller.Saltare condizionatamente un UIViewController in un'app iOS 5 con UINavigatonController

Ho provato [self performSegueWithIdentifier:@"segueId" sender:sender]; da viewDidLoad, viewWillAppear ma questo danneggia la barra di spostamento come indicato dal registro di debug. Chiamando questo codice da viewDidAppear funziona bene, ma poi la seconda vista è già visualizzata, che è quello che stavo cercando di evitare in primo luogo.

Ho anche provato [self.navigationController pushViewController:vc animated:NO]; ma il risultato è barra di spostamento in modo simile danneggiato, anche se questo registro di debug di ora non ha tali voci.

Quale sarebbe il modo supportato per farlo (se possibile)?

L'obiettivo è iPhone4 con iOS 5.1 e l'ambiente di sviluppo è Xcode 4.3.

risposta

8

Io uso il seguente codice in un'app. Funziona esattamente come previsto.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
    if (indexPath.row == 0) { 
     // skip second vc 
     ThirdViewController *thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ThirdViewControllerViewController"]; 
     [self.navigationController pushViewController:secondVC animated:NO]; 
     [self.navigationController pushViewController:thirdVC animated:YES]; 
    } 
    else { 
     // push second vc 
     [self.navigationController pushViewController:secondVC animated:YES]; 
    } 
} 
+0

Grazie mille per la risposta. Per essere in grado di implementarlo in questo modo, sembra che i controller non debbano necessitare di dati dal precedente. In questo momento nella nostra app ogni controller prepara i dati rilevanti (in base alla selezione dell'utente) per il controller successivo durante 'prepareForSegue'. Questo è il motivo per cui stavo cercando qualcosa che mi permettesse di "saltare" (cioè come se un seguito fosse eseguito automaticamente). Mi hai dato un'idea su cui pensare. Lasciami lavorare su di esso e vedere se riesco a incorporare questa idea nell'app. – alokoko

+0

C'era un po 'di mischia, ma ho funzionato. Continuo a sperare che ci fosse in qualche modo un modo per "saltare" (magari attraverso un seguito o un altro modo) che avrebbe funzionato all'interno dello stesso controller prima che la vista apparisse. – alokoko

+0

Un dettaglio che ho dimenticato di menzionare: Il pulsante Indietro sul terzo controller dopo il salto è etichettato come "Indietro" piuttosto che il titolo del secondo controller come sarebbe nella sequenza normale. Questo dovrebbe essere impostato manualmente? – alokoko

2

Se si desidera saltare un controller di vista si può chiamare UINavigationController setViewControllers:animated: Si animerà per l'ultimo controller nella matrice in dotazione, e l'utente sarà in grado di "indietro" da quella pila.

È possibile creare l'array di controller di visualizzazione in qualsiasi modo desiderato; forse a partire dalla gamma esistente di controller di visualizzazione:

NSMutableArray* newViewControllers = [[navController.viewcontrollers mutablecopy] autorelease]; 

[newViewControllers addObject: ...]; 

[navController setViewControllers: newViewControllers animated: YES]; 
+0

Grazie. Ciò sarà utile quando è necessario modificare lo stack in profondità e/o in situazioni più complesse. In questo momento, spingere i controller della vista in sequenza come suggerito da un altro poster sta funzionando bene. – alokoko

Problemi correlati