PROGRAMMING IOS      Simone Kalb
Chi è iOS?(in numeri)3° piattaforma mobile venduta al Mondo [IDC]25% Market share del mercato degli smartphones [IDC]+0.7%...
...e questo solo per iPhone!iOS per iPod Touch e iPadiPod Touch rappresenta il 38% di tutti i dispositivi con iOS [Ai]7.3M...
Chi è iOS? (a parole)Un sistema :  operativo moderno per piattaforme mobili e tablet  ideale per gli sviluppatori  forteme...
Chi lo usa?Tutte le maggiori aziende del settore IT hanno un’appLa maggior parte delle aziende di altri settoriMercato con...
Perché sviluppare per iOS?Mercato in espansioneAPI semplici e ottimamente documentateOpportunità di businessCosti d’ingres...
RequisitiPer sviluppare per iOS è necessario:Tempo (o una persona che te ne dedichi)(Gratis o quasi...)Un Mac (da €699,00)...
Ambiente di sviluppoSnow LeopardXcode v.3.2.5Interface Builder
Cosa c’è dentro iOS?Core OS e Core ServicesLow-level routines, CFNetwork, CFoundation, SQLite, POSIXMedia Layer2D, 3D draw...
Cosa vediamo in questo corso?Configurare l’ambiente di sviluppoUIKit e IB  View Controller  Navigation Controller  Table V...
Cosa vediamo in questo corso?MapKitUIWebViewParser JSONAPI LocationLayar SDK
XcodeScarichiamo Xcode da qui (necessaria registrazione gratuita)Doppio click sull’icona .pkgInstalliamo anche i tools agg...
INTERFACCIA DI XCODE     Diamo uno sguardo a come si presenta
Iniziamo con la prima AppFile ->New Project (Cmd+Maiusc+N)View-based-ApplicationNominatelo HelloBuild-and-GoDone!
Primi passi con IBAprite HellouserViewController.xibTrascinate una UILabel nella ViewLabel Size (cmd+3) portando l’altezza...
RisultatoEcco come appare la nostra app
RotazioneHardware -> Rotate Left; Il testo non ruoterà.IB Finestra d’ispezione (Mela+3).Strut e spring, attiviamo le sprin...
Modifica al codiceHelloViewController.m - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceO...
Due dritte per i TestSe siete registrati su ADC come iOS Developer potete:  Creare dei certificati per i dispositivi  Crea...
Nell’editorClick sulla barra dell’anteprima del filePotete saltare alla funzione che più vi interessaRichiamare la documen...
OBJECTIVE-C
Objective chi?Sovrainsieme del C di K&RAd esso completamente compatibile ed aderenteÈ un C completamente ad oggetti ma != ...
Aspetti della sintassiParentesi quadre nelle chiamatemioCarattere = [miaStringa characterAtIndex :3];I parametri hanno sem...
Tipi di classiFoundation contiene una serie sterminata di classi di largo uso:  NSString (al posto di char*)  NS{Array, Se...
Organizzazione files in XcodeClassesOther SourcesResourcesFrameworksProducts
IBOutlet e IBAction    IBOutlet è una finta “presa” che fa da ponte tra il codice e l’UI    IBAction gestisce le azioni ge...
ParticolaritàIBACtion equivale a voidIBOutletIBAction per il pulsante, non c’è bisogno dell’outletPattern (id) senderOgget...
IB Disegnare l’interfacciaAprire HelloUserViewController.xibVedremo due proxy e una viewInseriamo una UILabel, una UITextF...
Uno sguardo al File’s OwnerÈ un proxy alla viewCliccando col tasto destro si vedono sia gli outlet che le azioniOgnuno di ...
Connettere gli oggettiConnettiamo gli oggetti dell’UI con File’s OwnerOgni oggetto della UI viene connesso con un IBOutlet...
Implementazione dell’azione   Adesso implementiamo nel file HelloUserViewController.m-(void) sayHello:(id)sender {!! NSStr...
Commentiamo il codiceOtteniamo la stringa inserita dall’utente (proprietà)Instanza di una stringa a cui aggiungiamo “Hello...
Due parole sulle ApplicazioniDiamo uno sguardo a main.mUiApplicationMain è la funzione principale che si occupa delciclo d...
Andiamo a vedere i NIBApriamo i file MainWindows.xib (come ci suggerisce Info.plist)Icona di Delegato (HelloUserApp Delega...
Application, Life CycleIl delegato è connesso all’unica finestra dell’applicazioneIl ViewController carica la sua view da ...
La delegationLa delegation è uno dei pattern più importanti dello sviluppoUn oggetto chiama il suo unico delegato quando s...
Come funziona un delegato?Objective-C usa un protocollo di delega formale definito inUIApplicationDelegateQuesto sarebbe c...
Perché tutta questa storia?Nella nostra app la tastiera non è scomparsa dopo il tapIl tasto d’invio non ha avuto effettiBi...
..e per il tasto d’invio?Esaminiamo la classe delegata UITextFieldDelegateDovremo prendere in considerazione textFieldShou...
Modifichiamo il codice    HelloUserViewController.h@interface HelloUserViewController : UIViewController <UITextFieldDeleg...
Gestione della memoriaLa gestione della memoria su device mobili è fondamentaleÈ necessario appena possibile liberare quan...
Regole d’ingaggioLe regole auree sono:  se siete proprietari d’un oggetto lo dovete rilasciare  se fate new   alloc copy, ...
EsempioLa NSString ha un metodo stringWithFormat:Questo è un metodo a rilascio automaticoNon ha alcuna differenza con allo...
Rilasciamo gli oggetti    In HelloUserViewController:- (void)dealloc {!   [textField release];!   [nameField release];    ...
Le propertiesVariabili istanza con nomi che seguono convenzioni in r/wAccesso a slot per i getter e setter tramite l’opera...
Come si definisce la property@property (attributi) propType propName;Vantaggio in termini di leggibilità del codice ma anc...
Modifica del codice    HelloUserViewController.h@property(nonatomic, retain) UILabel *helloLabel;@property(nonatomic, reta...
RicapitoliamoLe variabili istanza nel .h  se le inseriamo nel .m gli altri non vi possono accedereGli oggetti sono creati ...
I VIEW CONTROLLER
MVCAltro paradigma fondamentale in CocoaIl View Controller è la “C”Interagisce con la View (“V”)Per rappresentare un Model...
Apriamo un nuovo progettoFile->New ProjectChiamiamolo MovieApriamo MovieViewController.xibAggiungiamo un IUButton alla Vie...
Aggiungiamo una Action    In MovieViewController.h:-(IBAction)done;    Torniamo in IB e facciamo un collegamento tra File’...
Creiamo il modello    Add->New File; Objective-C Class;    Chiamiamola Movie come subclass di NSObject e crea anche il .h@...
..e nell’implementazione     @implementation Movie@synthesize title;@synthesize boxOfficeGross;@synthesize summary;-(id)in...
Due precisazioni dueself=[super init] serve per gestire i casi in cui la superclasserestituisca oggetti diversi (alcuni FW...
Aggiunta di outlet e azioni       Nel file MovieViewController.h#import <UIKit/UIKit.h>@class Movie;@interface MovieViewCo...
E nel file .m    Adesso importiamo la classe Movie e sintetizziamo le properties:#import "MovieViewController.h"#import "M...
Le modifiche all’interfacciaNella nostra view inseriamo ben tre UILabel leggermentedistanziateConnettete correttamente gli...
Inizializzazione della View    Non appena si carica la view vogliamo che appaia qualcosa:- (void)viewDidLoad {    [super v...
Non appena la view è caricata    Ecco il codice per MovieViewController.m-(void)viewWillAppear:(BOOL)animated {!   [super ...
Creazione di un nuovo VCScegliete Add->NewFile e scegliete UIViewController SubclassRicordatevi di NON spuntare with XIB f...
MovieEditorViewController.h        @class Movie;@interface MovieEditorViewController : UIViewController <UITextFieldDelega...
MovieEditorViewController.m    Ricordiamoci di aggiungere                             #import Movie.h; e @synthesize    pe...
MovieEditorViewController.m    Dismettiamo l’attuale view modale per l’azione “Done”-(IBAction)done {!   [[self parentView...
textFieldShouldReturn:     -(BOOL)textFieldShouldReturn:(UITextField *)textField; {!   [textField resignFirstResponder];! ...
Creazione dell’UIAdd->New File da iOS->User Interfaces e scegliete View XIBChiamate il tutto MovieEditorViewController.xib...
Tenere sempre presente la            tastieraPensate sempre alla tastiera che deve apparire per i campi di testoPassword? ...
Creazione del MEVCAbbiamo quasi finito, ci manca solo come arrivare alla nuova viewI passi da seguire sono i seguenti:  Ag...
MVC.h       Il file MVC.h risulterà ora così:#import <UIKit/UIKit.h>@class Movie;@class MovieEditorViewController;@interfa...
Aggiorniamo edit:    Non dimentichiamo di aggiungere l’istruzione #import e i    synthesize per ciascuna proprietà.    Il ...
Fine!Finalmente l’applicazione dovrebbe essere prontaFacciamo click su Build and RunVerifichiamo che l’app funzioni corret...
Compiti per casaCostruire un’applicazione per il gioco delle 3 carteLa view principale contiene 3 bottoni e un’animazioneP...
Dubbi e domandeMetterò online le slide volta per voltaFacciamo un sitarello con Google Sites o equivalenteLa mia mail è si...
ALLA SETTIMANA  PROSSIMA!
Upcoming SlideShare
Loading in …5
×

Programming iOS lezione 1

3,369 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,369
On SlideShare
0
From Embeds
0
Number of Embeds
652
Actions
Shares
0
Downloads
61
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Programming iOS lezione 1

  1. 1. PROGRAMMING IOS Simone Kalb
  2. 2. Chi è iOS?(in numeri)3° piattaforma mobile venduta al Mondo [IDC]25% Market share del mercato degli smartphones [IDC]+0.7% aumento della quota di mercato in un anno [IDC]16.2M di unità vendute in un anno [IDC]90M di iPhone vendute con iOS da Giugno 2007 [9to5Mac]
  3. 3. ...e questo solo per iPhone!iOS per iPod Touch e iPadiPod Touch rappresenta il 38% di tutti i dispositivi con iOS [Ai]7.3M di iPad venduti dal lancio [WaBR]
  4. 4. Chi è iOS? (a parole)Un sistema : operativo moderno per piattaforme mobili e tablet ideale per gli sviluppatori fortemente orientato all’interazione gestuale
  5. 5. Chi lo usa?Tutte le maggiori aziende del settore IT hanno un’appLa maggior parte delle aziende di altri settoriMercato consumer gigantescoComunità di sviluppo fortissima a tutti i livelli
  6. 6. Perché sviluppare per iOS?Mercato in espansioneAPI semplici e ottimamente documentateOpportunità di businessCosti d’ingresso ridicoli
  7. 7. RequisitiPer sviluppare per iOS è necessario:Tempo (o una persona che te ne dedichi)(Gratis o quasi...)Un Mac (da €699,00)Un device con iOS (da €239,00)iOS Developer Program (da €79,00)Totale: da € 917,00
  8. 8. Ambiente di sviluppoSnow LeopardXcode v.3.2.5Interface Builder
  9. 9. Cosa c’è dentro iOS?Core OS e Core ServicesLow-level routines, CFNetwork, CFoundation, SQLite, POSIXMedia Layer2D, 3D drawing, audio, video, OpenGL ES, Quartz, Core{Audio, Animation}Cocoa TouchHigh level collections, UIKit, GameKit, iAd, MapKit
  10. 10. Cosa vediamo in questo corso?Configurare l’ambiente di sviluppoUIKit e IB View Controller Navigation Controller Table View Tab Controller
  11. 11. Cosa vediamo in questo corso?MapKitUIWebViewParser JSONAPI LocationLayar SDK
  12. 12. XcodeScarichiamo Xcode da qui (necessaria registrazione gratuita)Doppio click sull’icona .pkgInstalliamo anche i tools aggiuntiviScarichiamo la documentazione per iOS
  13. 13. INTERFACCIA DI XCODE Diamo uno sguardo a come si presenta
  14. 14. Iniziamo con la prima AppFile ->New Project (Cmd+Maiusc+N)View-based-ApplicationNominatelo HelloBuild-and-GoDone!
  15. 15. Primi passi con IBAprite HellouserViewController.xibTrascinate una UILabel nella ViewLabel Size (cmd+3) portando l’altezza a 80.Carattere (Cmd+t) a 48Doppio click e scriviamo “Ciao iPhone”Salvare e Build-and-Go
  16. 16. RisultatoEcco come appare la nostra app
  17. 17. RotazioneHardware -> Rotate Left; Il testo non ruoterà.IB Finestra d’ispezione (Mela+3).Strut e spring, attiviamo le springs in tutte e quattro le direzioni.Specificare anche l’allineamento del testo in maniera che risulticentrato
  18. 18. Modifica al codiceHelloViewController.m - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { // Return YES for supported orientations return YES }Ora premete Build-and-runComplimenti avete creato la vostra prima App per iPhone!
  19. 19. Due dritte per i TestSe siete registrati su ADC come iOS Developer potete: Creare dei certificati per i dispositivi Creare dei certificati per gli sviluppatori Diversi certificati per sviluppatori differenti Testare le applicazioni su device reali
  20. 20. Nell’editorClick sulla barra dell’anteprima del filePotete saltare alla funzione che più vi interessaRichiamare la documentazionePassare dal simulatore al device
  21. 21. OBJECTIVE-C
  22. 22. Objective chi?Sovrainsieme del C di K&RAd esso completamente compatibile ed aderenteÈ un C completamente ad oggetti ma != dal C++Agli oggetti sono inviati dei messaggiIl motore di runtime è incaricato dell’invio o meno dei messaggi
  23. 23. Aspetti della sintassiParentesi quadre nelle chiamatemioCarattere = [miaStringa characterAtIndex :3];I parametri hanno sempre un nome e due punti (keyword)Le classi hanno un file header e uno d’implementazionePersona.m/Persona.h
  24. 24. Tipi di classiFoundation contiene una serie sterminata di classi di largo uso: NSString (al posto di char*) NS{Array, Set, Dictionary}/NSMutable{Array, Set, Dictionary} NSNumber per numeri di tutti i tipi UIButton, UITextView,UITableView da UIKit
  25. 25. Organizzazione files in XcodeClassesOther SourcesResourcesFrameworksProducts
  26. 26. IBOutlet e IBAction IBOutlet è una finta “presa” che fa da ponte tra il codice e l’UI IBAction gestisce le azioni generate dall’interfaccia Verranno entrambe dichiarate nel file .h e istanziate nel .m@interface HelloUserViewController : UIViewController <UITextFieldDelegate> {!! IBOutlet UILabel *helloLabel;! IBOutlet UITextField *nameField;!}-(IBAction)sayHello: (id)sender;
  27. 27. ParticolaritàIBACtion equivale a voidIBOutletIBAction per il pulsante, non c’è bisogno dell’outletPattern (id) senderOggetto id
  28. 28. IB Disegnare l’interfacciaAprire HelloUserViewController.xibVedremo due proxy e una viewInseriamo una UILabel, una UITextField e un UIButtonPer semplicità la UILabel mettiamola vuotaNella finestra d’ispezione utilizzare un PlaceholderNel bottone utilizziamo la dicitura “Dimmi Ciao”
  29. 29. Uno sguardo al File’s OwnerÈ un proxy alla viewCliccando col tasto destro si vedono sia gli outlet che le azioniOgnuno di questi deve essere connesso ad un elemento di UIIn questo caso vedremo helloLabel e nameFieldVedremo la sua importanza nel prosieguo del corso
  30. 30. Connettere gli oggettiConnettiamo gli oggetti dell’UI con File’s OwnerOgni oggetto della UI viene connesso con un IBOutletIl bottone invece verrà connesso ad un’IBActionUnire l’evento TouchUp Inside con l’IBAction del File’s OwnerIn questo caso l’unica scelta disponibile è sayHello:
  31. 31. Implementazione dell’azione Adesso implementiamo nel file HelloUserViewController.m-(void) sayHello:(id)sender {!! NSString *username = nameField.text;! NSString *helloMessage = [[NSString alloc] initWithFormat:@"Hello %@", username];! helloLabel.text = helloMessage;! [helloMessage release];! nameField.text = NULL;! [nameField resignFirstResponder];}
  32. 32. Commentiamo il codiceOtteniamo la stringa inserita dall’utente (proprietà)Instanza di una stringa a cui aggiungiamo “Hello”%@ è uno specificatore di formato per una stringa di ∀ formatoImpostiamo la proprietà .text per la label con la stringa creataCi disfacciamo della stringa non essendo più usataReinizializziamo il campo testo della UITextField
  33. 33. Due parole sulle ApplicazioniDiamo uno sguardo a main.mUiApplicationMain è la funzione principale che si occupa delciclo di vita dell’applicazionei due ultimi argomenti sono la classe principale e la sua delegataLa delegata gestisce gli eventi nel ciclo di vita dell’applicazioneIn questo caso si carica tutto dai file NIB
  34. 34. Andiamo a vedere i NIBApriamo i file MainWindows.xib (come ci suggerisce Info.plist)Icona di Delegato (HelloUserApp Delegate)ViewController (HelloUserViewController)Finestra (UIWindow)File’s OwnerFirst Responder
  35. 35. Application, Life CycleIl delegato è connesso all’unica finestra dell’applicazioneIl ViewController carica la sua view da un NIBil primo metodo è applicationDidFinishLaunching: che carica con callback come initWithCoder: e viewDidLoad: il primo se caricato il NIB l’altro se caricata la view
  36. 36. La delegationLa delegation è uno dei pattern più importanti dello sviluppoUn oggetto chiama il suo unico delegato quando si verificanodeterminati eventiDal punto di vista del delegato è una callback “Chiamami quando succede questo”Da quello del delegante è uno scarico di responsabilità “Non so che fare, pensaci tu”
  37. 37. Come funziona un delegato?Objective-C usa un protocollo di delega formale definito inUIApplicationDelegateQuesto sarebbe come una normale classeDescrive, però quando i metodi saranno richiamatiCosa fare quando l’implementatore deve fare quando li richiamaDeve dichiarare che la propria classe implementa il protocollo
  38. 38. Perché tutta questa storia?Nella nostra app la tastiera non è scomparsa dopo il tapIl tasto d’invio non ha avuto effettiBisogna definire un delegato per il campo di testoPer la tastiera è necessario lasciare il ruolo di primo risponditorein sayHello: aggiungiamo la riga:[nameField resignFirstResponder];
  39. 39. ..e per il tasto d’invio?Esaminiamo la classe delegata UITextFieldDelegateDovremo prendere in considerazione textFieldShouldReturn:Quindi dovremo semplicemente overloadare il metodoE dire alla classe che implementa UITextFieldDelegate
  40. 40. Modifichiamo il codice HelloUserViewController.h@interface HelloUserViewController : UIViewController <UITextFieldDelegate> {...} HelloUserViewController.m-(BOOL)textFieldShouldReturn:(UITextField *)textField{!! [textField resignFirstResponder];! return YES;!} Ora basta un Build and Run.
  41. 41. Gestione della memoriaLa gestione della memoria su device mobili è fondamentaleÈ necessario appena possibile liberare quanta più memoriaOgni applicazione per iPhone deve gestirla correttamenteTutti gli oggetti sono allocati con conteggio riferimenti pari a 1retain incrementa il conteggio, release lo decrementaQuando il valore arriva a zero l’oggetto è pronto per il rilascio
  42. 42. Regole d’ingaggioLe regole auree sono: se siete proprietari d’un oggetto lo dovete rilasciare se fate new alloc copy, dovrete fare un release non rilasciate oggetti non vostri se volete appropriarvene fate un retain autorelease serve per metodi che restituiscono oggetti non in grado di gestire
  43. 43. EsempioLa NSString ha un metodo stringWithFormat:Questo è un metodo a rilascio automaticoNon ha alcuna differenza con alloc e initWithFormat:Questa chiamata non richiede il rilascio dell’oggetto
  44. 44. Rilasciamo gli oggetti In HelloUserViewController:- (void)dealloc {! [textField release];! [nameField release]; [super dealloc];} Così siamo sicuri di rilasciare correttamente tutte le variabili in gioco
  45. 45. Le propertiesVariabili istanza con nomi che seguono convenzioni in r/wAccesso a slot per i getter e setter tramite l’operatore punto[myLabel setText: myString]; - primamyLabel.text = myString; - dopoLe properties vanno definite nel file header fuori dalle parentesi
  46. 46. Come si definisce la property@property (attributi) propType propName;Vantaggio in termini di leggibilità del codice ma anche: Gestione della memoria (assign, retain, copy) Gestione threads (thread-safe, ma nonatomic è più rapido) @synthesize genera automaticamente i metodi get/set
  47. 47. Modifica del codice HelloUserViewController.h@property(nonatomic, retain) UILabel *helloLabel;@property(nonatomic, retain) UITextField *nameField; HelloUserViewController.m@synthesize helloLabel, nameField; Potremo richiamare helloUserViewController.nameField.text ovunque nel codice anche da altre classi
  48. 48. RicapitoliamoLe variabili istanza nel .h se le inseriamo nel .m gli altri non vi possono accedereGli oggetti sono creati nel codice o in IBGestite le connessioni con IBOutlets e IBAction in IB<nomeProtocollo> se volete implementare un delegato on in IBDichiarare le properties, sintetizzarle e gestire la memoria
  49. 49. I VIEW CONTROLLER
  50. 50. MVCAltro paradigma fondamentale in CocoaIl View Controller è la “C”Interagisce con la View (“V”)Per rappresentare un Modello (“M”) astrattoÈ un modello sul quale si basa gran parte di quel che vedremo
  51. 51. Apriamo un nuovo progettoFile->New ProjectChiamiamolo MovieApriamo MovieViewController.xibAggiungiamo un IUButton alla ViewAndiamo a modificare il codice
  52. 52. Aggiungiamo una Action In MovieViewController.h:-(IBAction)done; Torniamo in IB e facciamo un collegamento tra File’s Owner e il metodo TouchUp Inside Ora nel file d’implementazione:-(IBAction)done {! NSLog(@"Chiamato il metodo edit");} Ora provate a compilare..
  53. 53. Creiamo il modello Add->New File; Objective-C Class; Chiamiamola Movie come subclass di NSObject e crea anche il .h@interface Movie : NSObject {! NSString *title;! NSNumber *boxOfficeGross;! NSString *summary;!}-(id)initWithTitle:(NSString *)newTitle! boxOfficeGross:(NSNumber *)newBoxOfficeGross! ! summary:(NSString *)newSummary;@property(nonatomic, copy)NSString *title;@property(nonatomic, copy)NSNumber *boxOfficeGross;@property(nonatomic, copy) NSString *summary;
  54. 54. ..e nell’implementazione @implementation Movie@synthesize title;@synthesize boxOfficeGross;@synthesize summary;-(id)initWithTitle:(NSString *)newTitle! boxOfficeGross:(NSNumber *)newBoxOfficeGross! ! summary:(NSString *)newSummary {!! self = [super init];! if(nil != self) {! ! self.title = newTitle;! ! self.boxOfficeGross = newBoxOfficeGross;! ! self.summary = newSummary;! }! return self;!}-(void) dealloc {!! self.title = nil;! self.boxOfficeGross = nil;! self.summary = nil;! [super dealloc];!}@end
  55. 55. Due precisazioni dueself=[super init] serve per gestire i casi in cui la superclasserestituisca oggetti diversi (alcuni FWs lo fanno)Serve solo in casi di modelli personalizzatiAbbiamo impostato le properties come copy quindi un dealloc ènecessarioÈ buona norma mettere a nil le variabili istanzaLa classe ha solo un metodo initWithTitle:
  56. 56. Aggiunta di outlet e azioni Nel file MovieViewController.h#import <UIKit/UIKit.h>@class Movie;@interface MovieViewController : UIViewController {!! Movie *movie;! UILabel *titleLabel;! UILabel *boxOfficeGrossLabel;! UILabel *summaryLabel;! MovieEditorViewController *editingViewController;}@property(nonatomic, retain) Movie *movie;@property(nonatomic, retain) IBOutlet UILabel *titleLabel;@property(nonatomic, retain) IBOutlet UILabel *boxOfficeGrossLabel;@property(nonatomic, retain) IBOutlet UILabel *summaryLabel;@property(nonatomic, retain) IBOutlet MovieEditorViewController *editingViewController;-(IBAction)edit;@end Da notare come la @class Movie; sia una dichiarazione forward
  57. 57. E nel file .m Adesso importiamo la classe Movie e sintetizziamo le properties:#import "MovieViewController.h"#import "Movie.h"@implementation MovieViewController@synthesize titleLabel;@synthesize boxOfficeGrossLabel;@synthesize summaryLabel;@synthesize movie; Ora siamo pronti alla modifica dell’interfaccia in IB Apriamo MovieViewController.xib
  58. 58. Le modifiche all’interfacciaNella nostra view inseriamo ben tre UILabel leggermentedistanziateConnettete correttamente gli outlets con le labelsSalvate come al solito IB (altrimenti non succede nulla)Ritorniamo al codiceImplementiamo il controller in modo che visualizzi di dati
  59. 59. Inizializzazione della View Non appena si carica la view vogliamo che appaia qualcosa:- (void)viewDidLoad { [super viewDidLoad];! Movie *newMovie = [[[Movie alloc]! ! ! ! ! ! initWithTitle:@"Iron Man"! ! ! ! ! ! boxOfficeGross:[NSNumber numberWithFloat:650000000.00]! ! ! ! ! ! summary:@"Un tipo sveglio costruisce armi fighe"] autorelease];! self.movie = newMovie;} Succede che quando un controller riceve una richiesta vede se ha già una view, in caso contrario carica loadView: Poi viene richiamato viewDidLoad: non appena visualizzata la view, infine viene chiamato viewWillAppear:
  60. 60. Non appena la view è caricata Ecco il codice per MovieViewController.m-(void)viewWillAppear:(BOOL)animated {! [super viewWillAppear:animated];! self.titleLabel.text = self.movie.title;! NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];! [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];! self.boxOfficeGrossLabel.text = [formatter stringFromNumber:self.movie.boxOfficeGross];! [formatter release];! self.summaryLabel.text = self.movie.summary;!} Il codice aggiunge i dati per gli oggetti Movie nei campi di testo NSNumberFormatter viene usato per convertire numeri e stringhe
  61. 61. Creazione di un nuovo VCScegliete Add->NewFile e scegliete UIViewController SubclassRicordatevi di NON spuntare with XIB for user interfaceMovieEditorViewController sarà il nome del nuovo VCAndiamo subito a modificare il codice del controllerPartiamo dall’header file
  62. 62. MovieEditorViewController.h @class Movie;@interface MovieEditorViewController : UIViewController <UITextFieldDelegate> {! UITextField *titleField;! UITextField *boxOfficeGrossField;! UITextField *summaryField;! Movie *movie;}@property(nonatomic, retain) IBOutlet UITextField *titleField;@property(nonatomic, retain) IBOutlet UITextField *boxOfficeGrossField;@property(nonatomic, retain) IBOutlet UITextField *summaryField;@property(nonatomic, retain) Movie *movie;-(IBAction)done;@end Notiamo che implementiamo l’interfaccia UITextFieldDelegate E un metodo d’interfaccia per quando avremo finito, done:
  63. 63. MovieEditorViewController.m Ricordiamoci di aggiungere #import Movie.h; e @synthesize per le proprietà -(void)viewWillAppear:(BOOL)animated {! [super viewWillAppear:animated];! self.titleField.text = self.movie.title;! self.summaryField.text = self.movie.summary;! NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];! [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];! self.boxOfficeGrossField.text = [formatter stringFromNumber:self.movie.boxOfficeGross];! [formatter release];!} Notiamo come convertiamo una stringa il numero boxOfficeGross mediante un NSNumerFormatter
  64. 64. MovieEditorViewController.m Dismettiamo l’attuale view modale per l’azione “Done”-(IBAction)done {! [[self parentViewController] dismissModalViewControllerAnimated:YES];!} Renderemo in seguito il view controller delegato per ciascun campo di testo in IB Come prima vedremo come implementare i metodi textFielShouldReturn: e textFieldDidEndEditing:
  65. 65. textFieldShouldReturn: -(BOOL)textFieldShouldReturn:(UITextField *)textField; {! [textField resignFirstResponder];! return YES;!} Approfittiamo del momento in cui il controllo rilascia il ruolo di primo risponditore per inserire i dati nell’oggetto:-(void) textFieldDidEndEditing:(UITextField *)textField {! if(textField == self.titleField) {! ! self.movie.title = self.titleField.text;! } else if(textField == self.boxOfficeGrossField) {! ! NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];! ! [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];! ! self.movie.boxOfficeGross = [formatter numberFromString:self.boxOfficeGrossField.text];! ! [formatter release];! }else if(textField == self.summaryField) {! ! self.movie.summary = self.summaryField.text;! }} È necessario distinguere i valori digitati nei vari campi
  66. 66. Creazione dell’UIAdd->New File da iOS->User Interfaces e scegliete View XIBChiamate il tutto MovieEditorViewController.xibCambiamo subito il File’s Owner conMovieEditorViewControllerAggiungete tre campi di testo ed un pulsanteConnettete ciascuno degli outlet dei campi di testoConnettete infine l’IBAction e i delegati
  67. 67. Tenere sempre presente la tastieraPensate sempre alla tastiera che deve apparire per i campi di testoPassword? Numeri? URL? Ad ognuno la sua tastieraScegliere l’indicazione corretta del tasto d’invioL’uso di un segnaposto è talvolta incoraggiatoLa funzionalità Clear When Editing Begin va usata con cautela
  68. 68. Creazione del MEVCAbbiamo quasi finito, ci manca solo come arrivare alla nuova viewI passi da seguire sono i seguenti: Aggiungere un outlet a MVC per l’istanza di MEVC Aggiornare il metodo edit: Creare un’istanza di MEVC nel NIB di MVC e effettuare la connessione
  69. 69. MVC.h Il file MVC.h risulterà ora così:#import <UIKit/UIKit.h>@class Movie;@class MovieEditorViewController;@interface MovieViewController : UIViewController {!! Movie *movie;! UILabel *titleLabel;! UILabel *boxOfficeGrossLabel;! UILabel *summaryLabel;! MovieEditorViewController *editingViewController;}@property(nonatomic, retain) Movie *movie;@property(nonatomic, retain) IBOutlet UILabel *titleLabel;@property(nonatomic, retain) IBOutlet UILabel *boxOfficeGrossLabel;@property(nonatomic, retain) IBOutlet UILabel *summaryLabel;@property(nonatomic, retain) IBOutlet MovieEditorViewController *editingViewController;-(IBAction)edit;@end
  70. 70. Aggiorniamo edit: Non dimentichiamo di aggiungere l’istruzione #import e i synthesize per ciascuna proprietà. Il metodo edit: diventerà il seguente-(IBAction)edit {! self.editingViewController.movie = self.movie;! [self presentModalViewController:self.editingViewController! ! ! ! ! ! ! animated:YES];} Ora aggiungete un view controller al NIB di MVC, impostate MEVC come classe di questo NIB Infine connettete all’outlet evc del File’s Owner al nuovo VC
  71. 71. Fine!Finalmente l’applicazione dovrebbe essere prontaFacciamo click su Build and RunVerifichiamo che l’app funzioni correttamenteIn caso contrario scorriamo tutte le proprietà di IB e del codiceIn molti casi l’errore s’annida in un riferimento inesistente in IBAltre volte mancano le dichiarazioni forward o properties nonsintetizzate
  72. 72. Compiti per casaCostruire un’applicazione per il gioco delle 3 carteLa view principale contiene 3 bottoni e un’animazionePer l’animazione si vede una mano che mescola tre carteOgni bottone ti fa accedere ad una view con un’immagineSe la carta che abbiamo scelto è giusta l’immagine è positivaAltrimenti è negativa
  73. 73. Dubbi e domandeMetterò online le slide volta per voltaFacciamo un sitarello con Google Sites o equivalenteLa mia mail è simone.kalb@prossimaisola.comRispondo appena possoLa prossima lezione è su Tab Bar e Navigation Controller eMapKitScusate per la povertà d’immagini, cercherò di fare meglio..
  74. 74. ALLA SETTIMANA PROSSIMA!

×