Compatibile con Xcode 8

Tornare indietro tra Controller con l’Unwind Segue

ENTRA NEL NOSTRO GRUPPO FACEBOOK

×

Corso creare applicazioni per iOS con il linguaggio Swift

Gli Unwind Segue, cioè il sistema che permette di tornare indietro da qualsiasi tipologia di Segue, hanno salvato la vita a decine di migliaia di nuovi sviluppatori. Le nozioni della seguente lezione, anzi del modulo, vanno salvate nella tua personale bibbia del buon sviluppatore. Questa non è un'esercitazione! Quindi, soldato! Partiamo subito con una domanda. [...]

Torna a: Corso creare applicazioni per iOS con il linguaggio Swift > Applicazioni Multi Interfacce
  • Alessandro

    Peppe, nel caso volessi aggiungere ad una modale la barra con titolo della modale, tasto salva a destra e chiudi a sinistra, non essendo legata al NC, come posso fare?

    • Ciao Alessandro,

      Useremo proprio questo problema per studiare il passaggio di informazioni nella prossima lezione. Nel frattempo ti anticipo che puoi aggiungere un oggetto navigation bar anche ad uno non collegato ad un NavigationController. Lo devi vincolare e posizionare correttamente. Poi gli potrai aggiungere i Bar Button Item.

      Fammi sapere!

      • Alessandro

        Fatto e funziona! Scusa se anticipo alcuni argomenti ma per motivi di lavoro sto sperimentando alcune cose collegate al tuo corso e a volte ho la necessità di conoscerle :-) grazie e complimenti! ciao

        • Ma cheee, meglio! Così già ci si mette all’opera!
          Se ci sono altri problemi, chiedi pure ;)

          • Alessandro

            Ne approfitto :-) Ho visto che alcuni, per passare retroattivamente dati da un controller B ad un controller A, creano un protocol e usano delegate, dopo di che con il prepareForSegue passano i dati con il delegate. E’ la stessa cosa di usare l’unwind o sono cose diverse?

            • Sono due modi diversi di fare la stessa cosa. Quello di cui parli tu si chiama pattern Delegate e si crea utilizzando un protocol. Ne esiste anche un terzo che è il Pattern Singleton.
              Il primo metodo cioè l’unwind lo vedrai nella prossima lezione, gli altri due servono anche per altre cose e ne parlerò più avanti.
              Qual’è il migliore è difficile a dirsi e dipende da caso a caso. In generale l’unwind è più semplice da controllare perché ci sono step intermedi, prima dell’invio di un dato, che possono stoppare l’esecuzione del segue. Ed in più è stato creato solo per questo scopo (invio ritroso di dati).
              In genere su internet si vede l’invio tramite prepareForSegue e non può essere bloccato perché già il segue è in azione. Noi vedremo che esiste un metodo che viene invocato prima dell’avvio del segue che serve ad eseguire un check sull’effettiva validità delle informazioni.
              Mentre il pattern Delegate e Singleton hanno uno spettro d’utilizzo molto più ampio e non vanno visti come semplici metodi per lo scambio di dati.

            • Alessandro

              Chiaro! grazie ;-)

            • Di niente ;)

              Inviato da iPhone

  • Corra98

    Ciao Giuseppe, sto cercando di fare l’unwind al vc precedente. L’unica difficoltà è che, non usando un pulsante come nel tuo caso (uso il pulsante di un alert view), non posso assegnare dalla storyboard un ID per l’unwind (non posso fare ctrl+trascinamento su “Exit” visto che non ho un pulsante).
    Devo usare la modalità manuale?

    • Ciao corra,

      Quando crei un Alert view, ai bottoni assegni una funzione da far eseguire. Ora, se crei l’unwind segue in maniera manuale cioè da VC ad Exit Event puoi assegnargli un Identifier e poi eseguire l’unwind tramite performSegueWithIdentifier.

      Non so se mi sono spiegato bene

      • Corra98

        Credo di aver capito, grazie! Unica cosa: come assegnare l’identifier… Non riesco ad assegnarlo da VC ad Exit. Come vedi dalla foto non me lo prende :/

        Il tasto “pause” apre l’alert che deve rimandare alla vc precedente (quella bianca)

        • Corra98

          Risolto, grazie!

          • Lo scrivo in modo da poter aiutare anche gli altri (nella lezione c’è comunque scritto), bisogna selezionare il simbolo del VC (il primo a sinistra) e trascinare la freccia verso l’Exit. In alternativa si può selezionare il VC dal Document Outline

  • Alessandro

    Ciao peppe
    Ho rifatto tutto l’esercizio e va tutto bene…anzi troppo…
    Infatti quando aggiungo il button al terzo VC (quello per tornare alla home) riesco a tornare a quest’ultima ma senza vedere il secondo VC, quindi senza il controllo fatto con lo switch.
    Se aggiungo il controllo non cambia assolutamente nulla…
    È normale o sono io che sbaglio qualcosa?
    Grazie mille

    • Ciao Ale,

      É normalissimo, infatti dal 3 al 1 chiami il popToRootView ecc che pensa ad eliminare i VC intermedi dall’array.
      Il caso del controllo riguardava il passaggio da un VC, con segue non Push, ad un VC controllato dal navigation.

      Quindi hai fatto benissimo ;)

      • Alessandro

        Ok!
        grazie mille

  • tulchiar

    Ciao Giuseppe,
    ho un problema con l’Unwind Segue…
    Una volta aggiunta la @IBAction al SecondController l’unwind non viene mostrato nel pop up del bottone Exit.
    Questo mi accade anche con l’esercizio già svolto scaricato da Dropbox… anche se li tutto funziona correttamente…
    Mi trovo quindi bloccato in una schermata senza via di uscita.
    Non riesco proprio a capire dove sto sbagliando, ho provato anche a seguire altre guide e riportano gli stessi step riportati nel tuo corso… ma niente
    Ho provato a Googolare e qualcosa di analogo ha afflitto vecchie versioni di xCode…
    Help me please,
    Grazie.

    • Ciao Chiara,

      L’IBAction per l’unwind deve essere messo nel ViewController precedente e non in quello dove crei il segue (tramite il popup). Se vuoi tornare dal VC B al VC A, la IBAction di unwind deve essere messa nel VC A. Mentre nel VC B devi solamente creare il segue trascinando la freccia nell’exit event.

      Che versione di Xcode stai utilizzando?

      Fammi sapere!

  • ciao Giuseppe,
    approfitto del problema riscontrato per farti i complimenti per il corso veramente professionale e ben fatto.
    Il problema riguarda il progetto di partenza dell’Unwind segue…pur inserendo l’ @IBAction segueToSecondVC nel file SecondViewController.swift sul bottone exit cliccando non compare nessuna lista…è vuoto…nel progetto completo compare…
    non capisco se sbaglio io qualcosa (ma in fondo si tratta solo di inserire la riga di codice)…magari mi sfugge qualcosa di banale…oppure c’è un problema nel file
    Grazie, Vito

    • rieccomi…
      ho aperto un nuovo progetto costruendo da me il tutto e funziona….
      per il file non so, ma son contento che funzioni…forse meglio così…come tu suggerisci da più soddisfazione ed è più utile rifare i progetti da sé…
      grazie comunque….
      Vito

      • Ciao Vitoo!

        Grazie infinite per il complimento, non pensavo di riceverne così tanti. Anche se vado un po’ a rilento nella pubblicazione dei contenuti spero sempre che ogni lezione lasci un contenuto di valore.
        Per il resto sono contento che sei riuscito a risolvere da solo il problema, certe volte basta una svista per mandare in aria un intero progetto :P

        Alla prossima e buona programmazione ;)

  • fabiod

    Ciao Giuseppe, volevo sapere se, per tornare indietro, si può utilizzare il “popToViewController” con lo stesso sistema del “popViewControllerAnimated” cioè creando una IBAction a partire dal un Bottone nel modo seguente (a me da errore rosso, non accetta secondViewController) :

    @IBAction func buttonToSecondVC(sender: UIButton) {

    self.navigationController!.popToViewController(secondViewController , animated: true)

    }

    oppure il “popToViewController” si deve usare esclusivamente con il sistema dell’Unwind Segue (con Exit ecc.) come hai fatto vedere tu?

    Ps: sempre complimenti per il corso!

    Ah, un’altra domanda. Ma è possibile creare una struttura più complessa con più liste di ViewController legate a diversi Navigation Controller

    • Ciao Fabio,
      La riposta è già nella tua domanda. Il popviewcontroller funziona esclusivamente con segue push ed il relativo navigation controller associato. Infatti chiami il metodo dall’attributo navigationController che contiene il riferimento all’istanza del tuo NC inserito da storyboard (è opzionale perché solamente i VC con quel particolare segue vengono effettivamente collegati al NC).
      Per la tua seconda domanda, cioè per le liste, la risposta è sì. Puoi anche aggiungere altri NC nel mezzo e nel caso in cui alcuni VC intermedi non siano collegati da segue push e quindi perdi il riferimento al primo NC.
      In definitiva quasi tutte le app hanno struttura piramidale. Alla fine del corso, dopo il core data e quando costruiremo la prima app, vedrai una struttura di questo tipo.

      Grazie per il complimento d per qualsiasi dubbio, rimango a disposizione ;) Buona programmazione!!

      Giuseppe Sapienza
      xCoding.it | Sviluppa, Crea e codifica i tuoi sogni!

  • BodeMiller

    Ciao Giuseppe,
    ho scaricato da dropbox il progetto di partenza, e poi seguendo le istruzioni della lezione ho aggiunto il codice della IBAction “segueToSecondVC” (nel file SecondViewController.swift).
    Cliccando col tasto destro sul bottone “Exit” del DetailViewController però non vedo nulla.
    E quindi non riesco neanche a collegarlo al pulsante “Torna indietro”.
    Bastava aggiungere il codice o bisognava fare qualcos’altro?
    Ho visto che tulchiar aveva il mio stesso problema, ma non ho capito se l’ha risolto, e in caso come abbia fatto.
    Seguendo passo passo la lezione non riesco a capire cosa sto sbagliando….puoi darmi qualche suggerimento? Grazie

    • BodeMiller

      Dimenticavo, sto usando Xcode 7.3.1

    • Ciao Bode,
      Quando crei un uwind segue devi creare la IBAction nel ViewController che sta dietro. Solo così vedrai spuntare l’unwind quando passi la freccia sul bottone di Exit.

      Quindi se vuoi tornare da B ad A. Nel ViewControleller A, aggiungi:

      @IBAction func unwindSegueToA(sender: UIStoryboardSegue) {}

      E poi nel ViewController B, esegui il collegamento verso l’Exit. Così dovrebbe spuntarti la funzione unwindSegueToA.

      Dovrebbe essere questo il problema.

      Fammi sapere,
      Giuseppe Sapienza | xCoding.it

      • BodeMiller

        Grazie per la rapida risposta, purtroppo non riesco ad uscirne.
        Ho ricontrollato tutto parecchie volte, ma proprio non trovo l’errore.
        La IBAction è nel ViewController “A”, ma cliccando col tasto destro sul bottone “Exit” del ViewController “B” non vedo nulla.
        Provo a dare un’occhiata al progetto completo se trovo qualche differenza..

        • Fammi sapere Bode, in caso mandami il tuo progetto e ti dico di preciso dove stai sbagliando

  • Marco Dognini

    Ciao Peppe,
    ho bisogno di un chiarimento in merito all’errore di rum-time che hai risolto con il pop…
    Se collego il DetailVC al ThirdVC sempre con Present Modally, perché l’unwind segue verso l’HomeVC funziona correttamente senza presentare alcun errore di rum-time, mentre se collegato al SecondVC presenta l’errore?
    Grazie

    • Ciao Marco,
      Mi sembra strano che dia errore un unwind verso il viewcontroller che sta dietro. Non vorrei che fa conflitto con qualche dismiss non commentato.

      In caso caricami il progetto così lo vedo direttamente

      • Marco Dognini

        Ciao Peppe,
        mi sono spiegato male: nel tuo esempio quando dal Detail VC fai Unwind verso l’Home VC si genera l’errore di rum-time (che risolvi con il pop).
        Se però cambio posizione al Detail, e lo collego sempre tramite Present Modally al Third VC invece che al Second, l’unwind verso l’Home VC non genera errore di runtime, anche senza il pop.
        Spero di essermi spiegato….
        Grazie

        • Mmmh adesso ho capito però purtroppo non riesco a trovare una spiegazione logica al problema!

          Sarà l’orario :P

          Se mi dovesse venire l’illuminazione divina lo scrivo su Telegram

Start typing and press Enter to search