# Hello World in Objective C per iOS 6, prima applicazione per iPhone con xCode!

15

Ho notato che la maggior parte degli Hello World per iOS in italiano non sono molto aggiornati, e le ultime versioni di Objective C (nello specifico dal compilatore LLVM 3.0)hanno aggiunto delle modifiche tra cui la gestione della allocazione e deallocazione degli oggetti che ora sono gestiti in automatico da ARC(Automatic Reference Counting) senza più bisogno di specificare retain, release e autorelease.

Non è mia intenzione scendere nei dettagli di ARC ne tantomeno del linguaggio Objective C e della sua sintassi, per quello troverete molte guide sul web e sul sito di Apple Developer, per cui se non avete mai sentito parlare di un linguaggio di programmazione vi consiglio prima di leggervi qualche guida sui linguaggi ad oggetti, sul C e sull’uso di xCode.

Questo Hello World è un pò più complicato del normale, nel senso che non c’è solo una label con scritto Hello World ma contiene le seguenti feature:

  1. Text Box su cui scrivere il nome
  2. Pulsante di invio del nome
  3. Label per la comparsa a schermo del nome
  4. Controlli per far sparire la tastiera alla pressione del ‘Return’ e far inviare il nome
  5. Controlli per far si che anche se iconizzata, l’applicazione mantiene l’ultimo nome inserito
  6. Controlli per far si che anche se chiusa,  l’applicazione mantiene l’ultimo nome inserito
  7. Uso dell’NSUserDefaults per realizzare le due operazioni sopra elencate.

Bene iniziamo a progettare.

..:: 1 Creare il progetto con xCode  ::..

Per prima cosa ci serve xCode, apriamolo e andiamo su New Project e scegliamo dalla barra di sinistra iOS e poi Application e successivamente Single View Application1w

Ora diamo il nome al progetto (es helloWorld) e inseriamo anche il Company Identifier(necessario per farlo giare sui dispositivi fisici e solo se si possiede un certificato da sviluppatore) e il tipo di device(es iPhone). Il Class Prefix non è obbligatorio e non serve in questo caso, togliamo i flag da Use Storyboards e da Include Unit Tests.2wCreaimo il progetto e xCode ci porterà sul Summary, qui dobbiamo solo tenere l’orientazione Portrait del telefono, quindi deselezioniamo dalla voce Supported Interface Orientation le due modalità landscape(X rosse su”immagine sotto). Per ora limitiamoci a questo,z dicendo solo che da questa voce Summary è possibile fare molte altre cose come selezionare i certificati, impostare i loghi dell’applicazione e moltissime altre cose.3w1Come vediamo nella Navigation Bar sulla sinistra il progetto crea in automatico una serie di file e cartelle(vedi immagine sotto). Come prima voce abbiamo il nostro progetto, cliccandoci sopra andiamo sulle impostazioni viste prima tra cui il Summary, poi vediamo la cartella chiamata come il nome del progetto contenete cinque file.

4wI due AppDelegate (.h e .m) che non sono da modificare per questa semplice applicazione e  i  tre file ViewController (.h, .m e .xib) che ci serviranno per realizzare l’interfaccia grafica e il codice di implementazione vero e proprio..

Nella cartella SupportingFiles abbiamo una serie di file che non ci servono per questa applicazione ma è bene sapere che ci sono come il file main.m(che lancia AppDelegate), appure il .plist(per localizzazioni e altri scopi), il file .pch(contenente costanti globali o macro) e i .png che sono I background di default dell’applicazione.

Le cartelle Frameworks conenente gli ambienti di sviluppo e librerie che è posssibile importare a seconda delle necessità e infine l’otput una volta compilato è nella cartella Products.

..:: 2 Creazione dell’interfaccia grafica  ::..

Per prima cosa andiamo sul file ViewController.xib per aggiungere i vari oggetti che ci interesano, 5wdue label, un textfield e un bottone.

Quindi andiamo nella barra a destra (la Utility bar) e successivamente clicchiamo sulla lista degli oggetti disponibili(Show Object library) e cerchiamo la prima label. Trasciniamola sulla vista principale, facciamo doppio click e scriviamo quello che vogliamo far inserire all’utente(in questo caso “inserisci il tuo nome”).

7wCome secondo oggetto prendiamo un campo di testo normale (Text Field) e trasciniamolo sulla vista. Ora occorre “legarlo” al codice per cui clicchiamo sull’icona in alto a destra Show Assistant Editor in modo da farci vedere il codice della classe ViewController e clicchiamo con il tasto destro sul nostro Text Field. Ci comparirà un menù di impostazioni del campo di testo, come prima cosa assegnamo il Delegate 10swtrascinando il pallino sotto la voce Outlet all’icona File’s Owner della voce Placeholder(vedi immagine destra), poi assegnamo il Referencing Outlets (ovvero la proprety dell’oggetto) trascinando il pallino del New Referencig Outlet sul file header(vedi immagine in basso) in modo da creare la nostra proprety(chiamiamola inserisciNome) (vedi immagine in basso)che 11swcome si nota ha iltipo IBOutler il che vuol dire che è legata al file .xib. Ora che abbimo la prorety associata possiamoriferirci a lei per getire il  Text Field.

12w

Passiamo ora al bottone, creiamo un Round Rect Button sempre dalla barra Utilities in basso e trasciniamol8wo sulla vista, facciamo click destro sopra, poi passiamo in modalità Assistant Editor e trasciniamo il Referencing Outlet sul codice in modo da creare un’altra proprety e chiamiamola ad esempio bottoneSubmit. Ora dobbiamo dirgli che evento catturare del bottone, in questo caso TouchUpInside(cioè il click con il 14wrilascio) (vedi immagine a destra) e traciniamo sempre sul file .h dando nome alla funzione (es bottoneNome)  e il tipo (nel nostro caso UIButton). Facendo così oltre alla proprety avremmo anche il metodo “bottoneNome” esposto, vorrei far notare che per il nostro esempio potremmo anche non esporre il metodo in quanto non serve ad altre classi, però per la didattica teniamolo esposto nel nostro file .h. Ultima cosa del bottone è collegare il Referencing Outlets e creare la prorety che potremmo chiamare bottoneSubmit.

Per ultima cosa creiamo la label finale con scritto hello world e creiamo il Referencing Outlet trascinando sul file .h e chiamiamola ad esempio salutoLabel.

Ora abbiamo inserito tutti gli oggetti necessari nel file .xib, passiamo all’implementazione dei metodi.

..:: 3 Creazione dei metodi  ::..

Incominciamo con impostare nel file ViewController.h il delegate che ci servirà per gestire il test


@interface ViewController : UIViewController<UITextFieldDelegate>

in questo modo il metodo ViewController potrà implementare i metodi del UITextFieldDelegate.

Passiamo al file ViewController.m e facciamo i @synthesize delle tre proprety create prima per i metodi di set e get in questo modo:

 @synthesize inserisciNome, salutoLabel, bottoneSubmit; 

Aggiungiamo questo metodo che serve ad ‘agganciare’ la pressione del tasto return dopo che è uscita la tastiera in modo da farla scomparire(altrimento rimane a schermo)

 - (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}

ora aggiungiamo il metodo viewWillAppear(che è il metodo che viene chiamato quando l’applicazione comprare, sia che sia la prima apertura, sia che ritorni dalla riduzione a icona) queste righe di codice

- (void)viewWillAppear:(BOOL)animated
{
[salutoLabel setHidden:YES];
NSString *testoDefault = [[NSUserDefaults standardUserDefaults] objectForKey:@"saluto"];
[salutoLabel setHidden:(testoDefault == nil)];
[salutoLabel setText:[[NSString alloc] initWithFormat: @"%@", testoDefault ? testoDefault : @"" ]];
}

analizziamo il codice e alla riga 3 settiamo la proprety della label(di output) a hidden in modo che si veda solo la text box di input e il bottone di submit(non è obbligatorio ma rimane più preciso così). Alla riga 4 prepariamo una variabile di tipo NSString(stringa) testoDefault che ci servirà per salvare il testo inserito. Il testo lo andiamo a cercare nello standardUserDefaults alla chiave ‘saluto'(più avanti è spiegato come mai). Nella riga 5 si va a controllare se il testo è vuoto (nil) e in questo caso si lascia nascosta la label di output, oppure se non è nil va a settare a NON hidden la nostra label di output. Alla riga 6 andiamo finalmente a impostare la label di output(salutoLabel) al valore del nome inserito(testoDefault) solo se non è vuota, altrimenti inserisce una stringa vuota  (testoDefault ? testoDefault : @””) equivale a dire se il testoDefault è nil ritorna la stringa vuota(@””) altrimenti scrive il testo (testoDefault), è chiamato operatore ternario <condizione> ? <true> : <false>.

Bene, il metodo già esistente viewDidLoad (che viene caricato una sola volta quando si apre l’app) non lo tocchiamo in quanto noi abbiamo già aggiunto il viewWillAppear(che ovviamente parte anche al primo avvio dell’app) per cui non è corretto far eseguire le righe di codice due volte(sian in DidLoad che in WillAppear).

Ora implementiamo il metodo del nostro bottone che ci ha precedentemente creato il file .xib.


- (IBAction)bottoneNome:(UIButton *)sender
{
[salutoLabel setHidden:NO];
[self textFieldShouldReturn:inserisciNome];

salutoLabel.text = [[NSString alloc] initWithFormat:@"HelloWorld: %@", inserisciNome.text ];

NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:salutoLabel.text forKey:@"saluto"];
[def synchronize];

}

Questo metodo fa si che una volta inserito il testo e schiacciato il bottone saluta, compaia l’Hello World: <nome>. Alla riga 3 abbiamo sempre l’hidden della label di output, la riga 4 va a chiamare il metodo creato prima per nascondere la tastiera quando si preme il tasto return del tastierino a scomparsa. Alla riga 6, si salva il nome immesso dall’utente andandolo a prendere dalla proprety text del nostro TextField chiamato inserisciNome nella label di output salutoLabel. In riga 8, si crea una variabile chiamata ‘def’ di tipo NSUserDefaults (questa classe è come fosse una chache dell’utente dove poter salvare parametri che ci possono servire in qualsiasi momento, un pò come $_SESSION in php), infatti alla riga 9 salviamo il testo inserito (salutoLabel.text) in questa sorta di cache dandogli la chiave ‘saluto‘. Quindi abbiamo la corrispondenza chiave->valore, cioè un Dictionary in Obj C, oppure una HashMap in java o una Hash in Ruby, e la nostra chiave è saluto mentre il valore è il testo inserito dall’utente. L’ultima riga, la 10 serve per fare il Commit del salvataggio in UserDefaults.

L’ultimo metodo non è indispensabile ma permette di fare esattamente la stessa cosa che fa il metodo bottoneNome ma non alla pressione del bottone “SALUTA!” ma alla pressione del tasto return sulla tastiera a scomparsa.


- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self bottoneNome:nil];
}

Questo metodo non fa altro che chiamare il nostro precendente metodo bottoneNome.

Bene ora che avete inserito tutto non resta che compilare il codice e provare l’applicazione sul simulatore.

Se avete avuto problemi o se non mi sono spiegato bene vi metto i link per scaricar il mio progetto funzionante, buon lavoro!

download del progetto Hello World:

mediafire

MirrorCreator Logo

amazonclouddrive

hash:

md5: 4fd0fb7b315e5547cad7cdb98e680087

sha1: 23389adee56d52b62829084f89810ca5a07e20cf

2 commenti

  1. 10 per l’idea di un HW diverso dal solito, 5 (insufficiente) l’esposizione e la cura della grammatica

    • purtroppo è stato scritto di fretta senza prestare molta cura all’esposizione, hai ragione, spero che sia comunque stato utile.

I commenti sono chiusi.