Usare lo storyboard è molto semplice. Basta trascinare l'azione su "Esci". Ma come dovrei chiamarlo dal mio codice?
Usare lo storyboard è molto semplice. Basta trascinare l'azione su "Esci". Ma come dovrei chiamarlo dal mio codice?
Risposte:
Inserisci il nome del segmento per distendersi.
Quindi, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
con il tuo seguito identifica.
Ecco una risposta completa con Obiettivo C e Swift:
1) Creare un IBAction
segue 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.
3) Seleziona il seguente nello schema del documento del controller della vista sorgente (verrà elencato nella parte inferiore) e assegnagli un identificatore .
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.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
da ViewController
a è Exit
stata incredibilmente utile. Grazie!
bradleygriffith
La risposta è stata fantastica. Ho fatto il passo 10 e ho creato uno screenshot per semplificare. Questo è uno screenshot in Xcode 6.
unwind segue
nella barra laterale:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Quindi la tua soluzione funzionerà
Ho usato [self dismissViewControllerAnimated: YES completion: nil];
che ti restituirà alla chiamata ViewController
.
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.
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.
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;
}
}
}
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:
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 ).
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!
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)
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.
performSegueWithIdentfier
fa esattamente questo: eseguire il seguito da un ViewController a un altro