Home > Cocoa > (Studiando cocoa) Currency converter Parte 3°

(Studiando cocoa) Currency converter Parte 3°

Bene ora che abbiamo creato sia l’oggetto “Model” che l’oggetto “View” non rimane che collegare il tutto per mezzo dell’oggetto “Controller” ma prima di cominciare vediamo cosa sono: Outlets, Targets e Actions.

Outlets

Un Outlet è una speciale variabile che identifica un’oggetto.

Outlet

Outlet

Come facilmente si capisce dalla immagine è un’oggetto particolare perché può fare riferimento a qualsiasi altro oggetto dell’applicazione come  ad esempio un campo di testo, oppure un’istanza di una nostra classe. Gli Outlets posso essere configurati in IB e questo li rende ancora più speciali. Un outlet si dichiara così:

IBOutlet id nomeVariabile;

Gli oggetti che hanno id come tipo sono oggetti tipicizzati dinamicamente, durante il run-time verrà usato dinamicamente un tipo di dato idoneo. Benché questa funzionalità sia davvero potente e comoda perché ci permette di non preoccuparci dei tipi di dato durante lo sviluppo dell’applicazione, può essere però molto più difficile trovare e correggere alcuni bug. Quindi, quando non è strettamente necessario utilizzare un tipo dinamico e nella maggior parte dei casi non lo è, possiamo dichiarare gli Outlets come puntatori a classi di specifici oggetti. Ad esempio:

IBOutlet NSButton* myButton;

Gli Outlets vengono generalmente impostati in IB semplicemente disegnando una connessione fra due oggetti, esisto altri modi per impostare un Outlet ma questo è sicuramente il più conveniente.

Target/Action in IB

Le relazioni Target/Action vengono impostate nel pannello “Connections” nell’ispector di IB. Quando si chiede all’applicazione di eseguire una certa azione in pratica si manda un Action ad uno specifico Target che in IB è rappresentato da un Outlet di un certo oggetto. Alcuni oggetti, come ad esempio gli oggetti che ereditano da NSControl tipo NSButton, sono in grado di pilotare un metodo Action, in questi oggetti gli Outlets per Target e Action sono già definiti. Nei oggetti che invece creiamo noi come ad esempio un appController (quello che creeremo in questo articolo) possiamo definire le Action nel seguente modo:

- (IBAction)myAction:(id)sender;

Grazie a questa sintassi IB sarà capace di identificare le Action nei nostri oggetti e ci permetterà di collegarli agli altri oggetti dell’interfaccia.

In quale direzione collegare

Molto semplicemente possiamo definire due direzioni principali:

  • Per creare una connessione Action dobbiamo disegnare un collegamento fra l’oggetto dell’interfaccia grafica che genera l’azione e il nostro appController che la riceve.
  • Per creare una connessione Outlet dobbiamo disegnare un collegamento fra un nostro oggetto e un’altro oggetto sia che appartenga ad una classe da noi creata sia che sia un elemento dell’interfaccia grafica.

Ovviamente queste sono le connessioni più usate, ce ne sono dell’altre che a tempo debito verrano approfondite.

Il controller ConverterController

Bene è ora  di aggiungere il Controller alla nostra applicazione quindi similmente al Model aggiungiamo una classe al nostro progetto.

  • In Xcode selezioniamo il gruppo Classes nella finestra del proggetto
  • Scegliamo File >New File
  • Nella finestra di dialogo selezioniamo a sinistra Cocoa Class e a destra Objective-C Class scegliendo come Subclass of NSObject e clicchiamo su next.
  • Chiamiamo la nostra Classe ConverterController.m, assicuriamoci che sia selezionato also create ConverterController.h e clicchiamo su Finish.

ConverterController si occuperà quindi di comunicare sia con l’interfaccia sia con la classe Converter che esegue il calcolo. Apriamo ConverterController.h per definire l’interfaccia del nostro Controller. Dichiariamo 3 Outlets per i tre campi di testo:

IBOutlet NSTextField *ammountField;
IBOutlet NSTextField *euroField;
IBOutlet NSTextField *rateField;

Si tratta di dichiarazioni di variabili quindi vanno all’interno delle parentesi graffe, come vedete abbiamo dichiarato gli Outlets in modo statico perché sappiamo benissimo che si tratta di NSTextField.

Dobbiamo poi dichiarare il metodo Convert per eseguire il calcolo.

- (IBAction)convert:(id)sender;

Certamente in questa piccola Applicazione avremo potuto eseguire i calcoli all’interno del Controller senza scomodare la classe Converter, tuttavia abbiamo deciso di eseguire l’applicazione secondo lo schema MVC. Lo schema MVC offre i suoi benefici in applicazioni molto complesse perché rende il codice più riusabile e più ordinato, in questa piccola applicazione sembra quasi complicare le cose inutilmente.

Salviamo il nostro ConverterController.h

Colleghiamo ConverterController con l’interfaccia

Siamo pronti per collegare l’interfaccia al nostro Controller, apriamo MainMenu.xib in IB

  • Scegliamo menu File > Read Class File e selezioniamo ConverterController.h
  • Dal pannello Library prendiamo un Object (Il cubo Blu) e trasciniamolo nella finestra delle istanze MainMenu.xib
  • Selezioniamo l’Object e andiamo nell’ispector sull’ultima iconcina quella dell’identity.
  • Nel menu a tendina Class selezioniamo ConverterController
  • Ora se andiamo sempre nell’ispector sulla penultima iconcina, quella delle connection vedremo i tre Outlets e l’Action che abbiamo definito precedentemente in ControllerConverter.h.

Bene ora dobbiamo collegare gli Outlet di ConverterController con i relativi TextField nella finestra dell’applicazione.

  • Selezioniamo l’oggetto ConvertContorller e tenendo premuto il tasto Ctrl  disegnamo una connessione  fino al primo TexField (Exchange Rate x 1€)
  • Nel piccolo BlackBox che compare con la lista degli Outlets disponibili selezioniamo rateField.
  • Ripetiamo l’operazione per gli altri due TextField selezionando gli opportuni Outlets

Dobbiamo ora collegare il pulsante all’unica azione del nostro Controller

  • Selezioniamo nella finestra il Pulsante Convert e  tenendo premuto il tasto Ctrl disegnamo una connessione verso l’oggetto ConverterController.
  • Nel BlackBox selezioniamo l’unica azione disponibile convert:

Bene abbiamo creato tutte le connessioni necessaria fra il Controller e la View, salviamo MainMenu.xib. Per controllare se avete eseguito le connessioni correttamente basta che selezionate ConvertCotroller e nell’ispector delle connessioni cliccatte e poi passate il mouse sulle connessioni, i campi collegati si evidenzieranno.

Colleghiamo il Model al Controller

Per collegare il Model al Controller dobbiamo creare un’istanza di questo nel controller. Apriamo quindi di nuovo ConverterController.h e dichiariamo un puntatore alla classe Converter. Come abbiamo gia visto una variabile che deve contenere un’oggetto deve essere per forza un puntatore. Aggiungiamo quindi la seguente variabile tra le parentesi graffe:

Converter *converter;

Dobbiamo inoltre importare il file Converter.h per permettere a ConverterController di creare un’istanza di Converter. Aggiungiamo quindi la direttiva subito sotto l’ultima direttiva #import

#import "converter.h"

Salviamo ConverterController.h e apriamo ConverterController.m per implementare il metodo convert: utilizzando l’oggetto Converter.

Aggiungiamo la definizione del metodo convert: come di seguito:

- (IBAction)convert:(id)sender {
//dichiaro una variabile float interna al metodo
float amount;
//Creo un'istanza di converter
converter = [[Converter alloc]init];
//chiamo il metodo setSourceCurrencyAmount passandogli il valore del TextFiled
//euroField
[converter setSourceCurrencyAmount:[euroField floatValue]];
//chiamo il metodo setRate passandogli il valore di rateField
[converter setRate:[rateField floatValue]];
//utilizzo la variabile di metodo per ottenere la conversione chiamando il
//metodo convertCurrency
amount =   [converter convertCurrency];
//imposto il valore del campo amountField con il valore della variabile di metodo
[amountField setFloatValue:amount];
//torno al primo campo di testo
[rateField selectText:self];
}

Bene la nostra applicazione è in uno stadio finale prima di compilare dobbiamo fare un’ultima cosa.

Garbage Collection

Come avrete notato ogni volta che chiamiamo il metodo convert: attraverso l’istruzione:

converter = [[Converter alloc]init];

creiamo un’istanza di converter riservando nella memoria del mac uno spazio idoneo a contenere l’istanza. Dovremo quindi preoccuparci cancellare questo spazio una volta che l’oggetto ha finito il suo compito, dobbiamo deallocare la memoria. Tuttavia se la vostra applicazione è sviluppata per Mac Os X 10.5 o superiore, possiamo utilizzare una comoda nuova funzionalita di Objective-C 2.0 cioè: Garbage Collection. Utilizzando Garbage Collection non dobbiamo preoccuparci di deallocare gli oggetti che abbiamo istanziato.

Tuttavia Garbage Collection attualmente non è abilitato di default, dobbiamo abilitarlo manualmente.

  • In Xcode cliccate sul menu Project > Edit Project Settings
  • Cliccate sul tab build
  • Nei settings andate nel gruppo GCC 4.2 – Code Generation ed impostate Objective-C Garbage Collection su supported

Sarebbe opportuno studiare meglio questa cosa!

Bene ora siete pronti per compilare e testare Currency Converter cliccando su Build & Run.

Il prossimo appuntamento cercheremo di perfezionare l ‘applicazione e di tradurla in italiano.

Categorie:Cocoa Tag: , ,
  1. Nessun commento ancora...
  1. Nessun trackback ancora...