Come eseguire Unwind segue a livello di codice?


307

Usare lo storyboard è molto semplice. Basta trascinare l'azione su "Esci". Ma come dovrei chiamarlo dal mio codice?


33
Trovo che questa sia una domanda valida, ce l'ho fatta io. È possibile eseguire un svolgimento segue a livello di programmazione 1. creando un seguito manuale (ctrl-trascinamento dal proprietario del file per uscire), 2. assegnandogli un nome in IB, quindi 3. eseguendo un normale -performSegueWithIdentifier: mittente: nel codice.
Yang Meyer,

6
Non avrebbe dovuto essere chiuso IMO. Gli utenti che hanno votato per chiudere questa domanda non sembrano avere uno sfondo Obj-C / Cocoa Touch.
LJ Wilson,

Yang: Come gli dai un nome?
sarfata,

Uso solo [self dismissViewControllerAnimated: YES completamento: zero]; per uscire programmaticamente. Non so che sia un modo giusto o no.
Tangqiaoboy,

1
sarfata: per prima cosa devi creare un "svolgersi manuale segue" trascinando il tasto Ctrl dal viewcontroller su "Esci". Quindi è possibile trovare i seguenti nella struttura del documento.
Huggie,

Risposte:


283
  1. Crea un manuale segue ( ctrl-drag dal proprietario del file per uscire),
  2. Sceglilo nel menu Controller sinistro sotto il pulsante verde ESCI.

Sceglilo nel menu Controller sinistro sotto il pulsante verde ESCI

Inserisci il nome del segmento per distendersi.

Quindi, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.con il tuo seguito identifica.


25
1) "Proprietario del file" - non è quella vecchia terminologia? Ha funzionato per me controllare il trascinamento dal controller della vista alla sua icona Exit. 2) Anche se dovrebbe essere ovvio, Xcode sta cercando una dichiarazione nell'interfaccia dell'IBAction che accetta un argomento di UIStoryboardSegue; il discorso 407 della sessione del WWDC 2012 non lo menzionava e non incollava quel codice. Senza di esso, la mia icona Exit non sarebbe attiva quando si trascina il controllo su di esso. 3) È piuttosto bello che alla fine della tua grande freccia rossa, nel campo Azione, puoi premere la freccia "vai lì"!
Tobinjim,

71
Per chiunque, come me, ha ancora problemi con l'implementazione di questa risposta, ho messo insieme una procedura più dettagliata ed esempio in questo repository: github.com/bradley/iOSUnwindSegueProgrammatic (Non cercando di pubblicizzare me stesso, ho solo sbattuto la testa contro il muro per ore su questo e vedere un assetto funzionante mi aiuta.)
BradleyGriffith

3
@bradleygriffith Sei incredibilmente fantastico. Grazie per l'ottimo walkthrough!
Eli_Rozen

7
@bradleygriffith Vorrei che tu avessi reso questa una risposta in modo che potessi segnare anche quello! Il tuo contributo unico è stato stabilire quale controller di visualizzazione ottiene quale codice . Non l'ho trovato da nessuna parte. Grazie!
Aaron Vegh,

3
La chiave, per chiunque sia ancora perplesso su questo, è che l'IBACTION deve essere nel controller di visualizzazione a cui stai tornando, non quello in cui ti trovi attualmente. @Bradleygriffith lo spiega su GitHub, ma non l'ho visto menzionato altrove. Quella parte è critica.
Axeva,

163

Ecco una risposta completa con Obiettivo C e Swift:

1) Creare un IBActionsegue di svolgimento nel controller della vista di destinazione (dove si desidera seguire). Ovunque nel file di implementazione.

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2) Sul controller della vista sorgente (il controller da cui stai seguendo), ⌃ + trascina da "Nome dell'attività" per uscire. Nel pop-up dovresti vedere i seguenti svolgimenti creati nel passaggio 1. (Se non lo vedi, rivedi il primo passaggio). Scegli unwindToContainerVC: dal popup, o qualunque sia il nome del tuo metodo per connettere il tuo controller di sorgente all'IBAction di svolgimento.

inserisci qui la descrizione dell'immagine

3) Seleziona il seguente nello schema del documento del controller della vista sorgente (verrà elencato nella parte inferiore) e assegnagli un identificatore .

inserisci qui la descrizione dell'immagine

4) Chiama lo svolgimento di svolgersi utilizzando questo metodo dal controller della vista sorgente , sostituendo il nome di svolgimento segue.

// Obiettivo C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// Swift

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. Utilizzare la proprietà sourceViewController del parametro segue sul metodo unwind per accedere a tutte le proprietà esposte sul controller di origine. Si noti inoltre che il framework gestisce il licenziamento del controller di origine. Se desideri confermare ciò, aggiungi un metodo dealloc al controller di origine con un messaggio di registro che dovrebbe attivarsi una volta che è stato ucciso. Se dealloc non si attiva, è possibile che sia presente un ciclo di mantenimento.


2
Il mio programma non funziona, nemmeno chiamato(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
xhg

2
questa soluzione non funziona quando il controller di visualizzazione, a cui non ti stai occupando, esiste solo nello storyboard, ovvero non ha un'usanza personalizzata nell'implementazione del codice
mnl

@mnl non so esattamente cosa stai dicendo, ma funziona con scene o pennini dello storyboard. Se stai creando una scena viewcontroller nel codice, non useresti alcun metodo che "restituisca" IB nel loro nome, che è comunque nullo poiché questi servono allo scopo di comunicare tra codice e IB. Questo indirizza il tuo commento?
smileBot

1
La tua foto che mostra il ctrl+dragda ViewControllera è Exitstata incredibilmente utile. Grazie!
kbpontius,

Per Swift 4.2 utilizzare: self.performSegue (withIdentifier: "unwindToVC", mittente: self)
Reefwing

81

bradleygriffithLa risposta è stata fantastica. Ho fatto il passo 10 e ho creato uno screenshot per semplificare. Questo è uno screenshot in Xcode 6.

  1. Tieni premuto il tasto Ctrl e trascina dall'icona arancione all'icona Esci rossa per creare un svolgimento senza azioni / pulsanti nella vista.

inserisci qui la descrizione dell'immagine

  1. Quindi seleziona unwind seguenella barra laterale:

inserisci qui la descrizione dell'immagine

  1. Imposta una stringa identificatore di Segue:

inserisci qui la descrizione dell'immagine

  1. Accedi a quell'identificatore dal codice:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

4
Prima di tutto, il metodo per svolgersi deve essere incluso all'interno di UIViewController. Quindi la tua soluzione funzionerà
Alex Cio,

5
e devi impostare Identificatore su questo nuovo segue! Non dimenticartene.
kraag22,

1
È possibile creare la connessione "exit" nel controller della vista di origine a livello di codice?
Andrew Kirna,

13

Ho usato [self dismissViewControllerAnimated: YES completion: nil];che ti restituirà alla chiamata ViewController.


6
Larry, questo è un approccio perfettamente valido se vuoi tornare al controller della vista precedente, cioè quello che ha presentato quello a cui stai uscendo. La domanda è emersa perché la novità di Xcode 4.5 è la capacità di "distendersi" da un controller di visualizzazione da qualche parte nell'ordine di presentazione a un controller di visualizzazione molto precedente. Vedi la sessione 407 del WWDC 2012 per i dettagli.
Tobinjim,

11

Citando il testo dalla Nota tecnica di Apple su Unwind Segue: per aggiungere una sequenza di svolgimento che verrà attivata solo a livello di codice, controlla + trascina dall'icona del controller di visualizzazione della scena all'icona di uscita, quindi seleziona un'azione di svolgimento per la nuova sequenza dal menu a comparsa.

Link alla nota tecnica


6

La risposta di Vishal Chaudhry sopra ha funzionato per me. Vorrei anche aggiungere che per attivare manualmente il seque usando:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

dall'interno di ViewController è necessario selezionare anche lo svolgimento della sequenza sotto la scena di ViewController nello storyboard e nella vista delle proprietà su RHS assicurarsi che il campo Indentifier contenga il nome a cui si fa riferimento nel codice ("mySegueName" nell'esempio sopra ).

Se si omette questo passaggio, la riga sopra genererà un'eccezione che il nome seque non è noto.


3

Soluzione compatibile con le versioni precedenti che funzionerà per le versioni precedenti a iOS6, per chi fosse interessato:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}

2
I seguaci di Unwind fanno molto di più che tornare a una determinata classe in uno stack di controller di navigazione.
Steve Moser,

2

SWIFT 4 :

1. Crea un @IBAction con segue all'interno del controller a cui vuoi rilassarti:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2. Nello storyboard, dal controller si desidera seguire (svolgersi) da ctrl + trascinare dal segno del controller per uscire dal segno e scegliere il metodo creato in precedenza:

inserisci qui la descrizione dell'immagine

3. Ora puoi notare che nella struttura del documento hai una nuova riga con il titolo "Unwind segue ....". Ora dovresti fare clic su questa riga e aprire la finestra di ispezione degli attributi per impostare l'identificatore (nel mio caso unwindSegueIdentifier ).

inserisci qui la descrizione dell'immagine

4. Hai quasi finito! Ora devi aprire il controller di visualizzazione da cui desideri rilassarti e creare un metodo che eseguirà i seguenti. Ad esempio è possibile aggiungere un pulsante, collegarlo con il codice con @IBAction , dopodiché all'interno di questa IBAction aggiungere perfromSegue (con ID metodo: mittente :) :

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

Quindi è tutto ciò che devi fare!


È possibile creare la connessione "exit" nel controller della vista di origine a livello di codice?
Andrew Kirna,

1

Swift 4.2, Xcode 10+

Per coloro che si chiedono come farlo con i VC non impostati tramite lo storyboard (quelli che arrivano a questa domanda dalla ricerca "programmaticamente" + "unwind segue").

Dato che non è possibile impostare un svolgersi segue programmaticamente, la soluzione esclusivamente programmatica più semplice è quella di chiamare:

navigationController?.popToRootViewController(animated: true)

che riporterà tutti i controller di visualizzazione nello stack al controller di visualizzazione principale.


Per estrarre solo il controller della vista più in alto dallo stack di navigazione, utilizzare:

navigationController?.popViewController(animated: true)


1
che di solito è più di quello che vuoi - per fare un pop indietro basta: [self.navigationController popViewControllerAnimated: YES];
Andy Weinstein,

In effetti, l'ho aggiunto alla mia risposta - grazie @AndyWeinstein
10623169 il

0

Cordiali saluti: Affinché la risposta di @ Vadim funzioni con un'azione seque svolgersi manuale chiamata da un View Controller è necessario inserire il comando:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

all'interno del metodo di classe overriden viewDidAppear così:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

Se lo metti in altri metodi ViewController come viewDidLoad o viewWillAppear , verrà ignorato.


3
Sicuramente sbagliato. Chiama performSegueWithIdentifier da dove vuoi.
smileBot

Questo non eseguirà semplicemente unwind segue non appena la vista viene caricata? Invece di esibirti quando vuoi, ad esempio dopo aver premuto un pulsante.
Pahnev,

@Pahnev, sì. Non so come questa risposta abbia ottenuto alcun voto. La chiamata performSegueWithIdentfierfa esattamente questo: eseguire il seguito da un ViewController a un altro
ezcoding

Completamente sbagliato. Si riavvolgerebbe immediatamente al lancio.
Lee Probert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.