6

Mentre provavo gli storyboard per uno dei miei progetti mi sono imbattuto in qualcosa per cui non ho una buona soluzione;Come spingere una viewController prima di chiudere il controller della visualizzazione modale con Storyboard?

Ho un'applicazione basata sulla navigazione che mostra un UITableViewController. Il TableView è popolato con elementi creati dall'utente. Toccando una cella di un elemento si apre il controller della vista di dettaglio. L'utente può creare un nuovo elemento toccando un pulsante nella tabellaView. Questo fa apparire una vista modale, che gestirà la creazione.

Ora, quando un utente ha terminato di creare l'elemento e chiude il controller della vista modale, voglio che l'utente veda il nuovo controller della vista di dettaglio corrispondente e non il tableview. Ma non riesco a capire come ottenere questo negli storyboard.

Qualcuno ha un buon modello per questo?

Situazione attuale

TableView --(tap create)--> creation modal view --(finish creating)--> TableView 

Dovrebbe essere

TableView --(tap create)--> creation modal view --(finish creating)--> detail view 
+0

Aggiunta la mia risposta qui sotto. Tutti i modelli migliori che possono farlo con gli storyboard sono comunque apprezzati. – SpacyRicochet

risposta

0

Il miglior modello che ho potuto venire con, è lo stesso del vecchio modello in codice.

Aggiungere una proprietà (nonatomic, weak) UINavigationController *sourceNavigationController al controller della vista modale. Quando diventa il momento di respingere il controller di vista modale, aggiungere il seguente codice:

DetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
detailViewController.element = newlyCreatedElement; 
[[self sourceNavigationController] pushViewController:detailViewController animated:NO]; 

E per assicurarsi che il sourceNavigationController get set correttamente, aggiungere il seguente codice nel prepareForSegue: del TableView:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"newElementSegue"]) { 
     [[segue destinationViewController] setSourceNavigationController:self.navigationController]; 
    } 
} 
1

È possibile posizionare il controller di visualizzazione della creazione in un controller di navigazione e collegare il controller della vista di creazione al controller della vista di dettaglio con un push-follow. Al termine della creazione dei dati, verrà indirizzato a un'istanza del controller della visualizzazione dettagli.

Se si desidera tornare indietro dalla vista dei dettagli direttamente alla visualizzazione tabella, è possibile aggiungere una proprietà al controller della vista dettagli, ad esempio @property (nonatomic) BOOL cameFromCreationViewController;. È possibile impostare questa proprietà in prepareForSegue: nel controller della vista sorgente. Nella visualizzazione dettagli fai il tuo pulsante Indietro, e quando è TAPpato, puoi farlo:

if(self.cameFromCreationViewController){ 
    [self.presentingViewController dismissViewController]; 
} 
else { 
    [self.navigationController popViewController] 
}