Sei sulla pagina 1di 43

Il programmatore che c' in noi - Lezione 3 XCODE Tutorial Oggi, visto che siamo a fine settimana, facciamo qualcosa

a di rilassante, vediamo come creare un progetto Cocoa con XCODE e creiamo insieme un piccolo programma per visualizzare i LIMITI dei valori che possiamo inserire nei vari tipi di dati che ho descritto nella lezione 2. Ovviamente si presume che Xcode sia stato installato sul proprio Mac. - Individuiamo dove si trova lapplicazione XCODE

e la mandiamo in esecuzione, quindi scegliamo File. NewProject

Compare

E selezioniamo COCOA APPLICATION

A questo punto diamo il nome alla nostra applicazione, nel mio esempio limiti e scegliamo in quale cartella dovr risiedere il progetto, quindi premiamo Finish.

Ci appare lambiente di lavoro di XCODE

Per verificare se tutto a posto, creiamo la nostra applicazione (la prima ?...)

E se tutto e a posto, eccola!!! BCS ( un mio modo di dire Bella Come il Sole J )

Ovviamente non fa assolutamente nulla, pero ho gia una finestra e un menu. Andare a vedere dove stato creato il progetto, e vedrete tutti i files che Xcode ha generato per il progetto. Quelli con estensione .m e .h sono il codice sorgente in ObjectiveC, mentre quelli .nib sono i files di risorsa (=di interfaccia) usati da interface builder per progettare linterfaccia utente (le finestre, i bottono ecc.) Comunque rimando alla documentazione della Apple per maggior dettaglio, o eventualmente, postate un commento specifico su Tevac.

Visto che abbiamo accennato a Interface Builder ed alla interfaccia utente, ritorniamo in XCODE e con un doppio clic sul elemento MainMenu.nib attiviamo Interface Builder (IB) per andare a modificare la nostra finestra e iniziare a personalizzare la nostra applicazione.

Una volta lanciato Interface Builder, vi consiglio di attivare subito la visualizzazione dellIspettore degli oggetti tramite questo menu

e di disporre le varie finestre nel modo piu comodo per lavorarci

Ciccando sulla finestra (Window) vedremo cambiare le informazioni dellIspettore di oggetto, accertandosi che sia attivo per la nostra finestra (nella finestra dellispettore deve comparire il titolo NSWindow Inspector ) Andiamo a cambiare il nome della finestra dal generico Window in Limiti

Dopo linvio il nome della finestra viene aggiornato

Per fare un po di pratica, diciamo che ha laspetto metallico

ed otteniamo

Dallispettore, possibile modificare tutta una serie di impostazioni ciccando nella COMBOBOX, tra cui ad esempio la dimensione della finestra usando la voce Size della combobox.

Lispettore ora si presenta con i seguenti dati

Provare a modificare i valori di w (larghezza) e h (altezza) e vedrete la finestra cambiare dimensione.

Bene, posizioniamo ora degli oggetti di testo (etichette o label), in quanto Vogliamo far comparire nella nostra finestra delle indicazioni che scriviamo noi Oltre alla nostra finestra metallizzata, alla finestra dellispettore, abbiamo altre due finestre, una TOOL BAR e una che rappresenta il nostro oggetto MainMenu.nib Nella Tool bar, selezioniamo Cocoa-Text

e successivamente cliccliamo su una Label/Etichetta che vogliamo inserire nella nostra finestra metallizzata (esempio Small System Font Text)

e mantenendo premuto il tasto sinistro del mouse, trasciniamo la scritta sulla finestra metallizzata, quindi rilasciamo il tasto del mouse.

Una volta lasciato cadere loggetto testo, possiamo ciccarci sopra e spostarlo nella posizione a noi piu congeniale.

Mentre spostare loggetto selezionato, vedrete apparire delle linee guida che vi aiutano a disporre gradevolmente loggetto e rispettando le linee guida Apple relativamente a Acqua.

Per modificare invece il contenuto del testo, doppio clic e si scrive dentro (oppure si usa lispettore)

Nel nostro esempio, cambiamo la dicitura in char max, in quanto lidea per il nostro programma quella di far scrivere accanto al tipo di dato il suo range di valori minimi e massimi (i sui limiti).

Dato che abbiamo diversi elementi da posizionare, conviene usare il copia e incolla, Mela-C e Mela-V, quindi riposiziono gli oggetti.

e cosi via sino a completare la finestra con tutte le informazioni che intendo gestire.

Ecco come si presenta la finestra al termine.

A questo punto passo a posizionare un altro tipo di oggetto, un campo di input. Sempre dalla tool bar, cocoa-text, trascino lelemento che mi interessa nella finestra metallizzata

E lo lascio cadere

Come al solito, provvedo a posizionarlo ed eventualmente a ridimensionarlo.

Quindi uso il solito Copia/Incolla per velocizzare le operazioni di creazione di oggetti analoghi.

Sino ad ottenere leffetto desiderato

A questo punto, voglio che le dimensioni della finestra siano fisse, quindi non ridimensionabile dallutente, allora da Ispettore imposto Min w/h e Max w/h al valore della dimensione corrente della finestra.

Giunti a questo punto dobbiamo creare un nostro OGGETTO, che ci consentir di controllare la nostra finestra (o meglio i campi della nostra finestra) durante lesecuzione del programma. Infatti, quando il programma sar mandato in esecuzione, vorremmo far comparire a fianco della scritta char max il valore (es. 127) massimo che posso memorizzare in un dato di tipo char ecc. Per creare questo nostro oggetto controllore che chiameremo appunto ilControllore, dobbiamo usare la finestra MainMenu.nib.

Da tale finestra clicco sul tab CLASSES, e mi posiziono sulloggetto NSObject.

Una volta evidenziato NSObject clic con il destro (=CTRL+CLIC se ho il mouse con solo tastocredo) E dal menu che compare scelgo Subclass NSObject

Viene creata una nuova voce, MyObject, che io provvedo a rinominare con il nome ilControllore come avevo anticipato.

Do invio

e selezionando il mio oggetto ilControllore, clic di destro (per far apparire il menu contestuale)

E questa volta scelgo, Instantiate ilControllore, ossia chiedo a Interface Builder di creare il mio oggetto in modo che io possa lavorarci sopra.

Ed eccomi accontentato. Ora ho nel MainMenu.nib anche un oggetto che si chiama ilControllore che il mio oggetto appena creato. Ovviamente tale oggetto al momento un contenitore Vuoto. Lo seleziono, ciccandoci sopra

e guardo cosa succede nella finestra dellIspettore.

Vedete che ClassName = ilControllore (il nome del mio oggetto) e che un contenitore vuoto (0 Outlets e 0 Actions). Cosa deve fare il mio oggetto controllore ? Deve gestire il passaggio delle informazioni tra il mio programma sorgente e gli oggetti grafici (il testo, il campo di input, un pulsante ecc.) che io ho collocato sulla mia finestra. Nel nostro esempio, io voglio poter controllare da programma il campo Field Text che ho inserito a fianco delletichetta di testo char max e char min. Ovviamente questo andrebbe fatto per tutti i campi Text Field che abbiamo Posizionato nella nostra finestra metallizzata, ma io, in questo esempio lo faccio solo per i primi due a voi fare poi gli altri Per far conoscere al mio oggetto controllore loggetto Text Field (=rettangolo bianco) a fianco del testo char max, devo ciccare sul Tab Outlets nella finestra ispettore, relativamente alloggetto ilControllore come visibile

Quindi premo ADD per aggiungere un Outlet che mi consentir di accedere alloggetto Text Field.

Viene creato un nuovo elemento myOutlet

che ovviamente provvedo a chiamare in un modo piu idone

dato che voglio tramite questo outlet gestire questo campo (char max) come anticipato prima, il campo che abbiamo trascinato in precedenza nella nostra finestra metallizzata (quello rettangolare bianco) un oggetto Cocoa che si chiama NSTextField, puo essere usato sia come campo di input dati sia come campo di output. Ma impareremo a conoscerlo meglio nelle prossime puntate.

Nella colonna a fianco Outlet Name, ce la colonna Type, che identifica di che tipo loggetti A CUI SI RIFERISCE (o meglio si referir perche dovremo poi effettivamente collegarlo alloggetto che abbiamo messo sulla finestra metallizzata). Nel nostro casco, scegliamo NSTextField dallelenco che appare.

In modo da ottenere

Dato che in questo tutorial voglio gestire solo i primi due (char max e char min) rifaccio nuovamente loperazione. (tale operazione deve essere fatta per CIASCUN oggetto che ho messo sulla finestra del quale voglio avere il controllo tramite il codice sorgente del programma).

Bene, finita questa fase, ritorno sulla finestra MainMenu.nib

seleziono Instances in modo da portarmi nella seguente modalit

Ora, sulla sinistra del nostro oggetto ilControllore, comparso un punto esclamativo: esso indica che abbiamo degli outlets o delle actions da collegare. Quindi, colleghiamoli Loperazione che stiamo per fare (tramite drag & drop) collega le outlets che abbiamo appena creato con i

rispettivi oggetti Cocoa che avevamo piazzato sulla finestra metallizzata.

Per fare un COLLEGAMENTO di una OUTLET Clic sulloggetto presente in MainMenu.nib (ilControllore), premo il tasto CTRL e faccio CLIC, trascino il puntatore del mouse sopra loggetto che mi interessa collegare e lascio andare il tasto CTRL e il tasto del mouse Lispettore si posiziona in questa modalit

A questo punto faccio un clic sul OUTLET che voglio collegare alloggetto che ho precedentemente selezionato e premo CONNECT.

Quando collegato, compare un pallino sulla sinistra, e nella colonna Destination compare loggetto NSTextField. Rifaccio loperazione di collegamento anche per il secondo campo a fianco del testo char min (che sara collegato alloutlet limiteCharMin)

Se diamo uno sguardo al nostro oggetto ilControllore nella videata MainMenu.nib ora non ha piu il punto esclamativo.

Siamo quasi al dunque, abbiate fede Ora non ci rimane che chiedere a Interface Builder di creare per noi i files di sorgenti relativi al nostro oggetto ilControllore che abbiamo creato. Perche questo ? Semplice, noi vogliamo scrivere dei valori nei due NSTextField che abbiamo posizionato nella finestra metallizata e tali valori devono essere scritti dal nostro programma, quindi abbiamo bisogno dei files di programma (.m e .h) che rappresentano loggetto ilControllore. Tali files devono essere inclusi nel nostro progetto di xcode. Per far creare a Interface Builder i files necessari, selezioniamo CLASSES dalla finestra MainMenu.nib

Quindi selezioniamo il nostro oggetto ilControllore e facciamo comparire il menu contestuale (clic tasto destro del mouse)

Questa volta scegliamo CREATE FILES FOR ilControllore e compare

vedete che ha gia assegnato i nomi ai files .m e .h cre saranno creati e che saranno automaticamente aggiunti al progetto limiti. Non dobbiamo far altro che premere CHOOSE.

Bene, giunto il momento di abbandonare Interface Builder, salviamo tutto e chiudiamo.

Ritorno si XCODE e mi ritrovo i files che sono stati aggiunti da Interface Builder

Bene, vediamo cosa ce scritto dentro i files ilControllore.h e ilControllore.m, che sono parte dei sorgenti del nostro programma. Per vederne il contenuto, ciccate sul pulsante Editor nella barra strumenti

in modo da avere la seguente modalit di visualizzazione

Quello che vediamo stato scritto in automatico (seguendo le nostre indicazioni) relativamente alloggetto ilControllore. Sono facilmente riconoscibili i due outlet che abbiamo in precedenza creato.

Il file ilControllore.m, invece non ha nessuna indicazione particolare. Per concludere il mio tutorial, volevo scrivere il valore max e minimo consentito per un tipo di dato char. Per fare questo, devo intercettare un particolare evento di Cocoa, che si chiama awakeFromNib.

In pratica, quando lancio il programma, il programma in automatico carichera in memoria il file NIB indicato e creera tutti gli oggetti presenti nel file NIB stesso (tra cui il nostro ilControllore). Quando questo avviene, lapplicazione avvisa tutti gli oggetti inviando loro un messaggio di tipo awakeFromNib appunto. (=risvegliato dal NIB) In questo modo, nel mio programma, io posso effettuare delle azioni non appena loggetto viene creato, nel caso specifico lazione che io voglio fare quella di scrivere un valore dentro loggetto NSTextField collegato alloutlet limiteCharMax. Per fare cio devo aggiunger il metodo awakeFromNib nel codice sorgente del mio oggetto ilControllore.c e quindi allinterno di tale metodo, ricavare il valore max e min consentiti per un char. Per ricavare tale valore, non faccio altro che usare i valori costanti definiti dal file limits.h (che potete cercare sul vostro Mac.) Questo un pezzo di tale file
#include <ppc/_limits.h> #define CHAR_BIT #define MB_LEN_MAX #ifndef CLK_TCK #define CLK_TCK #endif 8 6 /* number of bits in a char */ /* Allow 31 bit UTF2 */

__DARWIN_CLK_TCK

/* ticks per second */

/* * According to ANSI (section 2.2.4.2), the values below must be usable by * #if preprocessing directives. Additionally, the expression must have the * same type as would an expression that is an object of the corresponding * type converted according to the integral promotions. The subtraction for * INT_MIN and LONG_MIN is so the value is not unsigned; 2147483648 is an * unsigned int for 32-bit two's complement ANSI compilers (section 3.1.3.2). * These numbers work for pcc as well. The UINT_MAX and ULONG_MAX values * are written as hex so that GCC will be quiet about large integer constants. */ #define SCHAR_MAX 127 /* min value for a signed char */ #define SCHAR_MIN (-128) /* max value for a signed char */ #define UCHAR_MAX #define CHAR_MAX 255 127 /* max value for an unsigned char */ /* max value for a char */

#define CHAR_MIN #define USHRT_MAX #define SHRT_MAX #define SHRT_MIN

(-128) 65535 32767 (-32768)

/* min value for a char */ /* max value for an unsigned short */ /* max value for a short */ /* min value for a short */

. Quindi il valore massimo di un char indicato dalla COSTANTE


CHAR_MAX che vale 127 come visibile dal file.

Dato che il valore numerico, ed il campo che io ho messo nella finestra metallizzata un NSTextField (campo di testo) lo devo convertire in testo. Per fare tale operazione, uso un oggetto Cocoa che rappresenta una stringa di caratteri NSString ed uso un suo metodo per convertire numeri in testo

stringWithFormat
Vedremo comunque meglio ed in dettaglio queste cose, in una prossima lezione. In pratica il codice che vado ad inserire dentro ilControllore.m Tra @implementation e @end

Quindi effettuo le operazioni di conversione dati numerici in stringa

e dico alla mia outlet (che rappresenta il campo NSTextField char max) di che ora contiene una stringa che il dato che interessa.

Ecco come si presenta il codice completo di ilControllore.m


#import "ilControllore.h" @implementation ilControllore -(void) awakeFromNib{ NSString *unaStringa; unaStringa=[NSString stringWithFormat:@"%d", CHAR_MAX]; [limiteCharMax setStringValue:unaStringa]; unaStringa=[NSString stringWithFormat:@"%d", CHAR_MIN]; [limiteCharMin setStringValue:unaStringa]; }

@end

Ed ecco il risultato finale dellapplicazione e del tutorial.

Esercitatevi a fare tutti i passagi che ho descritto in modo da acquisire la necessaria manualit ed a familiarizzare con lambiente XCODE e Interface Builder. Per i piu intraprendenti: provare a completare lapplicazione facendo calcolare anche gli altri valori e rendendo i campi solo di OUTPUT.

Se volete potete anche inviarmi il vostro lavoro al termine, al mio indirizzo email. Francesco Germinara Info@germinara.it www.germinara.it

Potrebbero piacerti anche