Passare informazioni tra ViewController

ENTRA NEL NOSTRO GRUPPO FACEBOOK

×

Corso creare applicazioni per iOS con il linguaggio Swift

Come si passano informazioni tra i ViewController? Studiamo, realizzando un’applicazione utile per la salute, i metodi di invio e ricezione.

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

    Ciao Peppe,

    premetto che fino a qui il tuo corso è straordinario per impostazione e soprattutto per il modo di spiegare le cose (sembra così facile… Scherzo).
    mi permetto solo di dire una cosa per esempio in questo modulo avevamo incomiciato un esercizio conttati, non era più giusto continuare con quello?
    la lezione precedente dico come hai impostato la spiegazione è stata spledita e chiara, spiegazione e un esempio semplice, non dico che questo è difficile ma ritengo (sempre per la mia poca esperienza) molto più completa grafica menù ecc forse ripeto sempre un mio parere se impostata come la lezione precendente con view semplici e focalizzarta almeno per adesso solo l’argomento delle lezione. :-)

    Grazie

    • Ciao Francesco,
      Grazie mille per il complimento!

      Si perfettamente ragione. Ho fatto questa lezione a mo di esercizio perché mi serviva un punto in cui riprendere, FORZATAMENTE, tutti gli argomenti fin ora trattati. Infatti se ci fai caso, il passaggio delle informazioni si risolve in pochissime righe di codice e non mi andava di lasciare il codice senza un vero esempio pratico.

      Dov’è finito l’esercizio degli appuntamenti? non è scomparso :P Mi tiro dietro l’applicazione degli appuntamenti dalla seconda lezione del corso per un motivo ben specifico, servono le tabelle. Tra qualche lezioni il focus sarà tutto incentrato sul risolvere quell’applicazione.

      Grazie per il feedback, per me è importantissimo riceverli soprattutto a questo stadio dello sviluppo. Anche perché dal mio punto di vista ritenevo più incompleta la precedente che questa. Quindi mi hai riportato sulla strada giusta da seguire ;)

      • Francesco

        Grazie a te Peppe,

        sai almeno a me dove ogni argomento è nuovo con concetti da imparare lo step by step mi risulta ottimale, poco, chiaro e vocalizzato sull’argomento da imparere.

  • Marco Piazza

    certamente non è una lezione semplice, per capirla va letta più volte.
    Per quanto riguarda la grafica penso che a questo punto del corso non sia impossibile realizzarla, nel caso si abbiano difficoltà basta ripassare le lezioni autolayout (come ho fatto io).
    Ovviamente dopo circa 3/4 di questa lezione inizia ad uscire il fumo dalle orecchie, sicuramente domani la rileggerò con calma, anche perché si tratta un argomento molto importante!!!!
    Siamo quasi a metà corso.. ancora non siamo in grado di realizzare un app (ho provato ed è stato un piccolo fallimento), ma bisogna iniziare a gestirsi autonomamente.. andando a rileggere i vari moduli se riscontriamo delle difficoltà, almeno io sto seguendo questa impostazione di studio.
    Certo comunque non è semplice rispetto ad altri framework!!

    • Scusa Marco, pensavo di averti risposto!

      Non siamo ancora a metà però ci siamo quasi. La cosa importante è quella di provare e riprovare a risolvere gli esercizi. Solo quando diventano automatici allora dovreste continuare ad andare avanti.

      Se leggi e non provi 5/6/7 volte poi le cose apprese vanno nel dimenticatoio dopo pochi giorni.

      Un consiglio? ogni codice che scrivi, accanto, metti un commento con la spiegazione ed il perché stai scrivendo quel codice. Così valuti da solo se sai cosa stai scrivendo e contemporaneamente stai memorizzando al doppio della velocità.

  • Alessandro

    Mi accodo anche io nel dire che il corso è davvero ben fatto e capisco non è semplice riuscire a dire tutto facendo una sola app di esempio, anche perché tanti concetti si intersecano e a volte non si hanno ancora alcune competenze per poterli capire bene.
    Invece pongo un quesito tecnico, nella classe Utente hai inizializzato altezza e peso con valore 0. Ma perché invece di assegnare i valori nell’init() non hai direttamente messo il valore nella proprietà quando dichiarata? var altezza:Double = 0 ecc..?
    grazie ;-)

    • Ciao Alessandro,

      Grazie mille! ovviamente il processo di passaggio delle informazioni è qualcosa che viene capito appieno solamente con pratica. Fortunatamente è una cosa che troveremo in tutti gli altri moduli, quindi appena capita l’occasione lo riprenderò.
      Mentre per l’altro quesito. La differenza tra i due tipi di inizializzazione è sottile. L’inizializzazione per init viene eseguita successivamente rispetto a quello che avviene per le proprietà. Ci sono casi in cui è necessario accedere ai valori delle proprietà prima che una classe viene inizializzata. Pensa ad esempio al passaggio delle informazioni. Ci sono casi in cui prima di passare un’info viene controllato un valore delle proprietà dell’altro oggetto, se questo non è stato ancora inizializzato, quella variabile potrebbe risultare nulla.
      Ma comunque sono situazioni che difficilmente accadono. Entrambe le modalità vanno bene. Anche se, come sempre, suggerisco di utilizzare l’opzionalità quando non c’è necessità di assegnare un valore da init.

      • Alessandro

        Ok. In questo caso specifico potevamo usare l’opzionalità? dopo tutto il valore io ce l’ho solamente per IMC che inizialmente è 0, ma altezza e peso finché non le inserisco possono anche non esistere..

        • Esattamente Alessandro! Hai colto in pieno il ragionamento

          Inviato da iPhone

          • Alessandro

            Quindi semplicemente così?

            • Yes! Oppure potresti anche mettere l’imc come proprietà di tipo stored. Cioè puoi usare il get per restituire direttamente il valore al richiamo della proprietà, senza dover usare la funzione.

            • alearcy

              A quanto pare ci sono più modi di fare le stesse cose…visto che siamo ad inizio corso ora è il momento di capire qual è la best practice, quando è che conviene usare una proprietà stored e quando un metodo? quando conviene inizializzare e quando dichiarare subito il valore della proprietà? se preferisci possiamo parlarne nel forum ;-)

            • Yes ci sono tanti modi per fare esattamente la stessa cosa. Questo perché ancora il linguaggio è giovane. Basta vedere Java dove è d’obbligo usare i getter e setter (che lì sono metodi) mentre qui possiamo utilizzarli sia come stored che creando dei metodi.

              Il mio consiglio è quello di usare una computed property (prima ho sbagliato :P) quando questa non fa altro che prendere i valori dalle altre proprietà della classe. Questo, ad esempio, è un caso. Oppure come nella lezione del corso free, la distanza tra due punti e così via.

              Un metodo dovrebbe essere un modo per permettere ad un utilizzatore di modificare il comportamento dell’oggetto o di interagire con le proprietà della classe.
              Ad esempio l’inserimento di un nuovo valore in un array, la ricerca o per tutte quelle operazioni che abbiamo fatto fin ora.

              Quindi ancora non c’è una vera regola, persino apple non da un vero e proprio
              suggerimento https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

            • alearcy

              Chiaro…forse la vera differenza è il livello di sicurezza che si vuole adottare

            • Ni, tra qualche lezione (se non ci sei già arrivato) vedrai gli accessori del codice che bloccano l’accesso alle proprietà.

              Però dall’altro lato le computed danno modo di interagire direttamente con la proprietà senza dover passare per un metodo. Quindi riduciamo di un livello la complessità generale. Uno sviluppatore esterno dovrebbe conoscere l’esistenza del metodo che modifica quella proprietà.

              Mentre con la computed si interagisce solo con essa.

            • alearcy

              Ok quindi mentre il metodo va conosciuto ed è più complesso (anche a livello di uso della memoria?) la get mi permette di sputare fuori dei valori, sulla base delle proprietà, di sola lettura senza complicare la classe?

            • L’uso della memoria dipende esclusivamente da ciò che eseguono. La get ti permette di sputare fuori un valore anche eseguendo dei calcoli (come l’esempio della distanza tra i due punti).

              Come sempre, dipende tutto da caso a caso e da ciò che serve a te.

            • alearcy

              Capito. Arrivando dalla programmazione funzionale non è semplice capire queste sottili differenzi..per me potrebbero esistere anche solo metodi visto che posso fare le tesse cose :-D

            • Lo stesso vale per me :P
              Abituato dall’università ad utilizzare C o Java, dove queste cose non esistono, ogni tanto dimentico dell’esistenza delle computed property. Però mi rendo conto che utilizzarle significa scrivere anche del codice più semplice da leggere e capire.

            • Alessandro

              Però posso gestire le eccezioni e gli errori con il get?

            • No, per il momento.
              Infatti Apple, https://forums.developer.apple.com/thread/4289#11819 , ha espressamente fatto capire che verrà presto implementato (anche se non è chiaro in quale delel future versioni).

  • Francesco

    Ciao Peppe,

    scusa la domanda forse banale ma perché abbiamo costruito un navigator controller se poi disattivato?

    L’applicazione va in errore se non inserisco nulla nei campi, io ho provato facendo un controllo nel file user ma non funziona, come mai?

    errore mi viene dato del file insert alla riga del peso che non trova ” self.user.peso = peso!”

    guard String(peso) != “” else {

    throw ErroreInserimento.PesoNullo

    }

    • Ciao Francesco,

      Perché disattivato? Il navigation controller serve a navigare, con segue di tipo SHOW, tra la View di Calcolo e la View di visualizzazione del IMC. Infatti se lo togli vedrai che pur utilizzando il segue Show non verrà utilizzato il suo effetto di default (cioè lo scorrimento da destra a sinistra e viceversa).

      Mentre per la seconda domanda, non ho ben capito dove ti esce questo errore.

      In caso mettimi uno screen

      • Francesco

        allora per l’errore:

        io ho provato nel file user ad aggiungere nel controllo un nuovo guard insieme agli altri nella funzione calcolaIMC

        guard String(peso) != “” else {
        throw ErroreInserimento.PesoNullo
        }

        quando provo con il simulatore e lascio il campo peso vuoto l’app si blocca e torna a Xcode e mi evidenzia la riga
        self.user.peso = peso! nel do del bottone della pagina file insertViewController dicendo.

        la mi domanda era perché il mio controllo inserito nel file user non funziona?

        • peso è una proprietà di tipo Double che viene inizializzata, dall’init, al valore di 0. Perché non fai il check direttamente sul Double?
          tu stai convertendo in String ma la conversione di un numero in String da l’equivalente numero in formato String, quindi avrai “0” e non una stringa vuota “”.

          • Francesco

            Scusa pepe ma c’è un controllo che verifica se è stato inserito un numero equivalente a 0. Il Problema è quando lasci il campo vuoto

            • Quando il campo è vuoto, il text della textfield è nil quindi il problema non si pone.
              Puoi controllare sul nil per vedere se il campo è vuoto. Diventa “” quando si inserisce del testo e poi si cancella.

  • nickbonny

    Ciao, non mi è chiaro come mai devo istanziare nel viewDidLoad “self.user = Utente()”; perché non bastava creare la “var user: Utente!” insieme alle altre var all’inizio dell’ InsertViewController?. Oltre a non essermi chiaro il motivo per cui l’applicazione non funziona senza istanziarlo nel viewDidLoad o nell’IBAction calcolaIMC_pressed, non mi è del tutto chiara la sintassi..=)

    • Ciao nick,

      Il metodo viewdDidLoad puoi immaginarlo come ad un metodo init per la classe ViewController. Quindi lì dentro ho instanziato l’utente in modo da averlo già creato prima dell’apparizione sullo schermo dell’interfaccia.

      Mentre per la seconda domanda non ho ben capito.

      Invece per il funzionamento della ibaction calcolaIMC. Prima converto i valori inseriti nei due textfield in double, poi controllo con un do catch try (lezione degli errori in swift nel corso gratuito) che non ci siano errori ed infine invio le informazioni al VC successivo con un performSegueWithIdentifier

      • nickbonny

        Okok grazie..adesso riguardando il codice ho capito! In pratica pensavo che bastasse la dichiarazione var user: Utente sotto alle var txt_peso txt_altezza ecc, mentre ovviamente bisognava anche inizializzarla.. Se subito all’inizio del codice scrivessi var user: Utente! = Utente() sarebbe giusto uguale?

        • esattatamente! doveva essere inizializzata.

          Il consiglio è quello di mettere le variabili, che possono servire a tutto il progetto, come proprietà di classe e non come variabili all’interno di un metodo. Nel nostro caso, l’utente è un oggetto fondamentale per l’applicazione e per questo motivo l’ho messo come proprietà della classe.

          Più avanti vedrai che questi oggetti importanti verranno scorporati in altre classi con il pattern Singleton.

  • ciao, lezione molto ricca e fatta proprio bene.
    Mi resta un problema irrisolto che riguarda la func shouldPerformSegueWithIdentifier…non riesco a farla funzionare, c’è qualcosa che non va…
    ho messo dei print e sembra che proprio non venga letta:

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {

    print(“vediamo se mi consideri….”)

    if identifier == “segueToIMC” {

    print(“ritorno false”)

    return false // oppure true
    }

    print(“vediamo se passa di qua”)

    return false // metti true per attivare tutti gli altri segue

    }

    non stampa nessun print…come se non venisse letta….dove posso sbagliare? (ovviamente messa nell’ insertVC…
    Grazie, Vito

    • Si c’è una cosa che ho dimenticato di scrivere nel tutorial. La shouldPerform non viene invocata quando il segue parte dal ViewController ma solamente quando parte da un elemento grafico della view (come un bottone per esempio).

      Almeno, credo dovrebbe essere questo il tuo problema!

      Appena posso rivedo la lezione

      • ok…aspetto la revisione poiché non mi è chiarissimo come performare la shouldPerform…
        in ogni caso o faccio lo switch dell’identifier sul prepareForSegue o sul shouldPerform vero (cioè è equivalente?)?
        Grazie…

        • Ciao Vito,
          Esegui il check sul prepareForSegue (quando si attiva lo should è comunque equivalente). Ma lo should si attiva solo per segue che partono direttamente da un elemento del VC (cioè dallo storyboard quando fai partire un segue, per esempio, da un bottone).

  • mirkojpn

    Ciao!
    Grande lezione…anche se mi sono bloccato praticamente all-inizio, ho creato le prime interfaccie e messo i vari segue, ma quando vado a provare il tutto e clicco sul bottone calcola, dovrebbe passare per il NC e poi andare al VC seguente, ma invece a me rimane su una schermata nera…non riesco a capire dove ho sbagliato ( il fatto che lo stia facendo dopo una giornata di lavoro non aiuta…)

    • Ciao Mirko,

      In questi casi la procedura è sempre quella di controllare con ordine le seguenti cose:
      – Il VC di destinazione ha una classe di riferimento ( questo probabilmente è l’errore) – Il segue ha un identifier
      – controlla, con un click destro sul bottone, che questo non abbia già un segue senza identifier (cioè lo hai creato selezionandolo e trascinando la freccia direttamente su VC di destinazione, in questo caso puoi far a meno dell’identifier)
      Fammi sapere e nel frattempo ti avviso che siamo su Telegram al seguente indirizzo https://telegram.me/xcoding_dev
      Giuseppe Sapienza
      xCoding.it | Sviluppa, Crea e codifica i tuoi sogni!

  • ct78

    mi è piaciuta la lezione, anche se un po’ lunga… alla fine funzionava tutto…tranne il passaggio dei dati. ho eseguito 2 volte la lezione…ma arrivo stanco alla fine…e quando mi tocca comprendere e immettere in codice nel progetto qualcosa non mi torna… ho preso i file da dropBox per confrontarli con i miei….adesso funziona…mi mancava un pezzetto di codice. ma sono confuso sul ritorno dei dati. la rileggerò nuovamente domani…non mi arrendo :)

    • Sopratutto queste lezioni e nozioni, hanno bisogno di un po’ di tempo per maturare. Quindi il consiglio è sempre quello di rileggere più volte e di riprovare e riprovare gli esempi e codici proposti.
      Alla prossima ;)

Start typing and press Enter to search

Unwind Segue e non solo