Compatibile con Xcode

Esercizi Passaggio Informazioni

ENTRA NEL NOSTRO GRUPPO FACEBOOK

×

Corso creare applicazioni per iOS con il linguaggio Swift

Dato che c'è moltissima carne sul fuoco, prima di analizzare l'esecuzione su dispositivo e la chiusura della tastiera (serve la conoscenza del pattern Delegate) ti assegno un paio d'esercizi per metterti alla prova con i multi ViewController ed il passaggio dei dati. Esercizio 0. L'applicazione che devi realizzare ti permette di scorrere e visualizzare gli elementi di [...]

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

    Ciao Peppe, ho trovato molto ostico il secondo esercizio.
    Non tanto per il creare le funzioni o il collegamento dei vari segue ma per l’implementazione concettuale della classe.
    Ho dovuto scaricare il tuo esercizio risolto per capire come avevi collegato e creato le classi….
    Concettualmente forse questo esercizio è troppo avanti rispetto a questo punto del corso.. più per la forma mentis delle classi.

    • Più che normale Marco!
      Quando l’ho scritto l’intento era quello di mettere in difficoltà. Ora che hai visto come l’ho risolto, prova a rifarlo senza guardare il progetto. Prova e riprova finché i passaggi non diventano automatici e soprattutto commenta il codice dando una spiegazione ad ogni riga. Così vedi cosa ti ricordi e se sai cosa fa ogni singola istruzione. Si impara solo osservando il lavoro degli altri e provando da soli ;)

      P.s. Tra poco rilascio la nuova lezione

      Inviato da iPhone

  • lele

    Ciao Peppe, nell’esercizio n° 1 svolto da te non riesco a capire come è possibile ottenere il nome dell’utente semplicemente con self.nome_label.text = “Ciao, (utente.nome)” in quanto non vedo il legame tra la variabile utente definita nella HomeViewController e quella definita nel ViewController.

    • Ciao Emanuele,

      Guarda bene i segue. L’account viene registrato nella SignInViewController quindi l’oggetto utente viene creato qui. In uno scenario reale, viene fatta una richiesta ad un server che restituisce l’utente registrato.
      Da qui, l’oggetto utente viene passato al LoginViewController (nel progetto è il ViewController). Quando l’utilizzatore mette i dati nei campi viene eseguito un normale check con i dati già posseduti dall’oggetto user (perché l’avevamo precedente registrato). Se i dati combaciano, l’utente viene passato alla HomeViewController che mostra il nome nella label.

      Se sono stato poco chiaro, dimmi pure!

      • Emanuele

        La prima parte mi è chiara mi perdo quando dici che l’utente, quindi nome e password, viene passato alla HomeViewController perchè all’interno di questa classe vedo che è creata una nuova variabile (var utente: Utente!) e non capisco come questa contenga i dati. Io avrei usato nel ViewController la funzione prepareForSegue facendo il classico down cast per passare il dato. Era sbagliato fare cosi?

        • Esattamente! funziona tutto tramite passaggio di informazioni.

          Appena arriverai al singleton vedrai che, per questo particolare caso, le cose cambieranno drasticamente.

  • nickbonny

    Ciao peppe, ho un problema nella risoluzione dell’esercizio 1. In pratica ho creato una class Utenti con all’interno delle variabili che sono degli array. Questi array mi servono per salvare al loro interno i nomi utente e le password di coloro che si registrano nel ViewController di registrazione. Poi nel viewController dove vado a fare il login, scorro questi array e controllo che il nome e la password corrispondano con quella salvate negli array. Il mio problema è che se non si è ancora iscritto nessuno e gli array sono vuoti, quando nel viewController della login provo a riempire le textField e premere il tasto login, parte il ciclo for che prova ad accedere agli array ma si ritrova un nil e mi da un fatal error. Quindi volevo fare un semplice controllo su questi array, e fare partire il for solo nel caso gli array abbiano già dei valori..

    Io ho provato così ma non funziona:

    guard user.arrayNomeUtenti != nil else {
    return
    }

    Cosa posso fare?

    • ti basta controllare se l’array è vuoto.

      guard !user.arrayNomeUtentiRegistrati.isEmpty() elae {print(“nessun utente registrato”)} o. in alternativa user.nomeUtentiRegistrati.count > 0
      nel primo caso ti restituisce true se è vuoto, nel secondo caso sei tu a vedere se l’array è vuoto o no e agisci di conseguenza Inviato da iPhone

      • nickbonny

        No anche in quel modo l’errore era uguale. l’errore era che avevo istanziato self.user = Utenti() non nel viewDidLoad ma nella IBAction.
        Come mai se non lo inizializzo nel viewDidLoad ma nella IBAction mi da quel tipo di errore?

      • nickbonny

        Si beh penso che isEmpty vada proprio a fare il controllo che ho fatto anche io. Comunque ho capito che l’errore consisteva nel fatto che ho istanziato self.user = Utenti() non nel viewDidLoad ma nella IBAction..Cosa cambia? E perché se inizializzo user nella IBAction mi da quell’errore??

        • Ciao Nick,
          Pensavo di averti risposto ma forse non è arrivato il messaggio. Comunque il fatto di istanziare l’oggetto user nella classe serve a rendere questo oggetto una proprietà della classe (quindi accessibile a tutti gli attributi e metodi della classe). Invece, metterlo nell’IBAction significherebbe recluderlo solo all’interno di quel metodo, senza dare la possibilità agli altri oggetti di conoscerlo.

  • nickbonny

    Ciao peppe, vorrei sapere un pochino meglio come funzionano i dizionari..ad esempio non sapevo si potesse fare self.alimenti[inCategoria].append ecc. Dove posso trovare una documentazione un pochino esaustiva? Perché cercando su internet trovo principalmente il funzionamento degli array.
    Grazie

    • ciao nick,
      un dizionario è formato da una chiave di riferimento e da un valore associato a quella chiave. var dizionario: [Int:Int]
      quando ti riferisci a dizionario[i] ti stai riferendo al contenuto, un intero. se il dizionario è dichiarato come [Int:[Int]], allora dizionario[i] è un oggetto di tipo array di interi. ne deriva che, dato un dizionario del tipo voluto, lo potrai trattate a tutti gli effetti con tutti i metodi a lui relativi. nell’ultimo caso ha un valore dichiarato array, quindi il metodo append gli appartiene e lo puoi usare. questa regola è sempre valida, anche per altri tipi composti, come gli array, anche lì, se dichiarassi un array di array: [[Int]] potrei usare una formula del genere array.append([0,1,3,4,9])
      array[0].append(10)

      tornando al dizionario.
      var diz=[“a”:”parola”]
      diz[“a”] è il riferimento alla stringa “parola”
      quindi puoi ciclarla con un for grazie all’aver ereditato i metodi e proprietà delle stringhe for c in diz[“a”].characters { print(c) }

      Inviato da iPhone

      • nickbonny

        Ok grazie. Però ho ancora una difficoltà, infatti io volevo fare un controllo che non mi permettesse di aggiungere un alimento che c’è già in una delle categorie. Quindi dato che ho… var lista: (String: [Alimento]), vorrei entrare in ogni categoria e far scorrere il relativo array per vedere se già esiste quell’alimento.

        • suddividi il problema nick,
          come faresti con un array come var cibi : [Alimento]? <- domanda, non opzionalita’ ;) risolvi questo problema, ne va da se che il metodo e’ lo stesso con il dizionario var lista = [“cibi”:[Alimento], “detersivi”:[String]]
          lista[“cibi”] sara’ da sostituire a cibi nella soluzione apportata usando l’array cibi. se il tuo problema era questo, questa e’ la strada da percorrere, se invece hai bisogno di aiuto nel risolvere il problema a prescindere dal tipo usato non ti preoccupare e chiedi espressamente.

  • Gabriele Brescancin

    Ciao Peppe, sto svolgendo l’esercizio 1, quello del Form Utente. Nel VC Home hai messo un Navigation Item a cui hai cambiato il title in “Home”. Ho provato a farlo anche io, ma il Navigation Item non è visibile, pur essendo presente. Non riesco a capire: ho messo gli stessi oggetti che hai inserito tu…
    grazie.

  • ct78

    l’ ultimo esercizio l’ho capito nella carta concettualmente , ma nella pratica non riesco a ricrearlo…mi segnala troppi errori mentre lo creo….e vado in palla…
    vorrei chiedere a voi 2 cose:
    1) ho capito che gli unwind servono per tornare indietro, tuttavia possono anche essere usati per restituire i dati solo alla view precedente?
    2) il prepareForSegue si usa per trasportare i dati sia alla view successiva che a quella precedente ?
    Grazie

  • Lollo82

    Ciao Peppe. Dopo tutte le varie personalizzazioni, nel primo esercizio (perchè al momento li son arrivato) e all’esercizio precedente dell’imc volevo aggiungere che in caso di textfield vuote i bottoni calcola (esercizio imc), e aggiungi (primo esercizio), fossero bianchi (come il tasto invia dei messaggi quando il campo del testo è vuoto).
    Mi basta semplicemente creare una iboutlet per il bottone e modificarne la proprietà??? Se si quale è??? E soprattutto qual’è la action per la textfield che rileva se è piena o vuota??? In pratica vorrei ottenere che si disattivasse anche nel momento in cui io scrivo qualcosa e poi lo cancello.
    Grazie infinite di tutto Peppe e colgo l’occasione per dirti che il tuo corso è qualcosa di veramente straordinario.

    • Ciao Lollo,
      Per quanto riguarda la modifica del colore, ti basta modificare la proprietà backgroundColor della Outlet che creerai tra codice e la tua textField (comunque modificare il colore di sfondo non so quanto possa risultare esteticamente bello, ma è sempre un esercizio in più).

      Invece, per comprendere se la textField è piena oppure no o comunque controllare le modifiche puntuali (cioè carattere per carattere inserito) puoi utilizzare l’Action della TextField chiamata valueDidChange.
      Questa action si attiverà per qualsiasi interazione eseguita con la textField (inserimento e cancellazione di caratteri).
      Ergo, puoi sfruttare questo metodo per controllare la presenza o meno di caratteri.

      Rimango a disposizione e grazie per il complimento ;)
      Giuseppe Sapienza

      • Lollo82

        Peppe riguardo al pulsante credo di essermi spiegato male.
        Intendevo renderlo passatemi il termine “non cliccabile”. Appunto come accade per il tasto invia dei messaggi che sino a che non c’è un testo anche se ci clicco sopra è come se cliccassi su una semplice label.
        Mentre per la textfield faccio un pò di prove con la action che mi hai detto. Anche se come giustamente dici tu alla fine della fiera non serve a nulla ma è tutta arte che entra. :)

        • Adesso è più chiaro! Puoi bloccare l’utilizzo del bottone passando a false la proprietà enabled

Start typing and press Enter to search