2012-02-10 16 views
67

Sto cercando di creare un meccanismo per eseguire il drill down di un elenco di file/cartelle. L'idea è di mostrare lo stesso controller di visualizzazione dell'elenco file ogni volta che l'utente seleziona una cartella e mostra un controller di visualizzazione dei dettagli del file se lui/lei seleziona un file.Segue Storyboard dal controller di visualizzazione a se stesso

Finora, ho creato un segue dalla lista di file View Controller al controller vista di dettaglio del file, e un segue dalla lista dei file visualizzazione della tabella cella alla lista dei file controller della vista tabella:

enter image description here

Il problema con questo è che non appena l'utente tocca la cella, viene eseguito il seguito. Vorrei rimuovere il seguito dalla cella di visualizzazione tabella e crearne uno dal controller della vista dell'elenco file. In questo modo, potrei attivare i giusti passaggi a livello di codice quando l'utente ha toccato la cella.

Quindi, la mia domanda è: è possibile creare un seguito da un controller di visualizzazione a se stesso in Interface Builder?

+1

Sì, utilizzando xcode 5 è possibile. [vedi post] (http://stackoverflow.com/questions/9226983/storyboard-segue-from-view-controller-to-itself/23436265#23436265). –

+0

Aprire il menu Editor, fare clic su 'Mostra struttura documento', quindi premere il pulsante destro e trascinare dalla cella sull'oggetto' ViewController' dell'elenco file della struttura. –

risposta

25

Ho sviluppato un metodo per creare un seguito utilizzando un pulsante phantom. Credo che risolverà il tuo problema. Puoi leggere a riguardo nella mia risposta here.

+4

Questo mi ha messo sulla strada giusta. Ho aggiunto un pulsante sul "Dock" e l'ho collegato al controller di visualizzazione dell'elenco dei file. Ora posso eseguire i passaggi a livello di codice come volevo. Grazie! – Jorge

+1

Vorrei che questo non fosse necessario solo per ottenere un auto-follow, ma questo funziona. – jogloran

+2

La soluzione di Mustafa è meno hacky e piuttosto semplice. L'esecuzione delle stesse visualizzazioni con i pulsanti fantasma renderà solo il tuo storyboard un disastro. – strada

23

Invece di eseguire una sequenza sullo stesso controller, è possibile creare un'istanza di un controller di visualizzazione (la stessa) dallo storyboard, quindi spostarla sul controller di navigazione.

+0

Mi piace la soluzione del pulsante fantasma meglio tutte le mie transizioni in avanti passano attraverso prepareForSegue: invece di ricordare se una transizione viene creata in IB o codice. –

40

Se si utilizza un controller di navigazione, è necessario spingere ViewController nella pila di navigazione. In questo esempio, ho chiamato il mio ViewController "VDI" nella mia impostazione ID Storyboard.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; 
[self.navigationController pushViewController:dest animated:YES]; 

Se non si desidera che il navigationController continuare ad aggiungere sé nella vostra storia "Indietro" è possibile pop lo stack prima di aggiungere ad essa in questo modo.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"]; 
UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:dest animated:YES]; 
+0

Entrambi i metodi one e @ TJ/@ Jorge funzioneranno. Sono andato per questo perché mi sembra più pulito. I benefici che posso vedere nell'altro metodo sono che puoi vedere i tuoi passaggi in loop nello storyboard e che puoi gestire tutta la tua navigazione in "prepareForSegue:" – siburb

+1

Perfettamente funzionante! Inoltre, questo è lo "Storyboard ID" in XCode che ha impostato su "VDI", per coloro che cercano di ricreare questo. – Nerrolken

13

In IOS 6, v'è a cleaner solution rispetto all'utilizzo di un pulsante fantasma. È ancora possibile definire la segue dalla cella tabella per il controller della vista, e guardare al mittente di annullare la segue innescato automaticamente:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    //storyboards should use segues and override prepareForSegue instead 
    //but here we need custom logic to determine which segue to use 
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    if (item meets condition) { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } else { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath 
    return (sender == self); 
} 
0

Spero che questo aiuti.

Ho scoperto che è possibile creare più celle prototipo.

Quindi è possibile collegare ogni cella (nello Storyboard) a un'altra vista.

Qualcosa di simile a questo:

NSString *CellIdentifier = @"Cell"; 
if (Condition2){ 
CellIdentifier = @"Cell2"; } 
if (Condition3){ 
CellIdentifier = @"Cell3"; } 
27

Uso Xcode 5 c'è un molto più soluzione più semplice .

  1. Fare clic sulla cella tabella nella storyboard
  2. Aprire l'ispettore Connections (icona con la freccia a destra in alto a destra)
  3. In "innescato segues" si vede "selezione"
  4. Trascinate dal cerchio successivo a "selezione" alla cella nello storyboard

Questo è tutto.

+2

Questo approccio funziona come un fascino senza linea di codice. –

+2

Questa è * la * risposta corretta per xcode 5+ e in questi giorni dovresti usare un "show" per questo. – CupawnTae

+2

Non sembra funzionare per me, il controller della vista non diventa "blu" per consentire di aggiungere il seguito. – db0

3

Ecco come si può spingere un'altra istanza del controller della vista corrente senza definire un segue o hardcoding proprio identificativo:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier]; 
[self.navigationController pushViewController: same animated: YES]; 

Hai solo bisogno di impostare l'ID di restauro per essere lo stesso Storyboard ID (non c'è una casella di controllo per quello in IB).

Restoration ID

4

approccio Interface Builder: Appena Segue un riferimento storyboard che rimanda al controller della vista presentazione.

+1

Questo approccio è il più bello se l'altra navigazione viene eseguita con segues in IB! Grazie! –

0

La risposta corretta è utilizzare un Riferimento Storyboard che fa riferimento a UIViewController che si desidera seguire su se stesso e quindi puntare il seguito su di esso.

enter image description here

Problemi correlati