Tutorial Pratici Per IOS SDK v2.0

154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0 http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 1/154

description

tutorial per sdk ios

Transcript of Tutorial Pratici Per IOS SDK v2.0

Page 1: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 1/154

Page 2: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 2/154

Page 3: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 3/154

I N D I C E

Prefazione

Introduzione

  Xcode: una breve panoramica

Primi passi in Xcode

  I template

  Creare un nuovo progetto

  Le proprietà del progetto

  Interface Builder

  Le novità di iOS 5

Capitolo 1 - “Hello World”

      Scriviamo il codice necessario

  Nascondiamo la tastiera

 

Capitolo 2 - Uno sguardo ai componenti base

    Scriviamo il codice necessario

Capitolo 3 - Gestiamo immagini ed eseguiamo semplici animazioni

 

  Implementiamo il movimento del logo 

Capitolo 4 - MultiBrowser: creiamo un browser

    Creiamo la seconda vista

  Scriviamo il codice per aprire la pagina desiderata

  Gestiamo il passaggio tra le due viste

7

9

9

13

13

15

16

18

21

23

23

25

28

29

33

33

36

39

39

41

45

45

48

51

52

Page 4: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 4/154

Capitolo 5 - UITableView: le tabelle

    Creiamo la struttura

  Scriviamo il codice necessario

      La vista di dettaglio

  Parte 3: Implementiamo la ricerca

   Aggiungiamo il box di ricerca

    Implementiamo la ricerca

Capitolo 6 - AccessContact: utilizziamo i contatti    Scriviamo il codice necessario

 

Capitolo 7 - XML

  Cosa è XML

      Scriviamo il codice necessario 

Capitolo 8 - SQL

  Creiamo il database

      Mostriamo i valori del database

    Inserimento di un nuovo elemento 

Capitolo 9 - Creiamo un semplice lettore di feed RSS

  Parte 1: Creiamo la base del lettore

       

       

55

!!

55

56

"#

61

62

"$

64

65

68

71

71

73

79

79

81

81

83

87

88

94

96

99

102

105

111

###

111

112

115

##%

117120

123

#&"

Page 5: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 5/154

I N D I C E

Capitolo 10 - Realizziamo il nostro “Brushes”

            Scriviamo il codice necessario

  Parte 3: Inseriamo il salvataggio del disegno

 

Conclusioni

131

#'#

131

134

#'(

139

142

#$%

151

153

Page 6: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 6/154

Page 7: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 7/1547

P R E F A Z I O N E

Prefazione

-

ne. Questo ebook, infatti, è giunto alla seconda versione, dopo più di due anni dalla

sua prima versione. Tante cose sono cambiate in questi due anni, sicuramente nonmi aspettavo un successo così grande per questa piccola guida.

-

-

-

biate un quadro d’insieme generale.

-

-

fessionale.

 

E ricordatevi, solo essendo curiosi e affamati è possibile scoprire e creare qualcosa

di nuovo e veramente innovativo.

“Siate affamati, siate folli.” 

Page 8: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 8/154

Page 9: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 9/1549

I N T R O D U Z I O N E

I. Introduzione

Se avete acquistato e state leggendo questo ebook sicuramente termini come

-

- nuovi dispositivi sempre più presenti nella vita quotidiana. Tutti, insomma, parlano di

 

 

 Xcode: una breve panoramica

Quando parliamo di Xcode ci riferiamo, solitamente, all’insieme dei tool di sviluppo

 /Developer/Applications  

Dashcode

Instruments -

ovviamente, agli sviluppatori più esperti.

Quartz Composer 

 Xcode

Page 10: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 10/154

Page 11: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 11/154

Page 12: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 12/15412

Utility Area lavora in Interface Builder). Permette inoltre di accedere velocemente alla documen-

Debug Area - grado di far stampare dei messaggi in quell’area, vedremo poi come. In questa se-

servirebbe un libro solo per quello. Per avere una panoramica completa su que-

Learn about using Xcode

Page 13: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 13/154

Page 14: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 14/154

Page 15: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 15/15415

P R I M I   P A S S I   I N   X C O D E

Creare un nuovo progetto

-

-

Product Name in qualsiasi momento).

  -

-

to in automatico da Xcode).

 

Device Family  -

entrambi i dispositivi.

Use storyboard 

Use Automatic Reference Counting -

Include Unit Test 

Page 16: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 16/154

Page 17: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 17/154

Page 18: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 18/154

Page 19: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 19/154

Page 20: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 20/154

Page 21: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 21/15421

P R I M I   P A S S I   I N   X C O D E

Le novità di iOS 5

Prima di iOS 5 quando si creavano oggetti ed elementi era necessario occuparsi

- -

mo questi aspetti man mano li troveremo nell’ebook.

Page 22: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 22/154

Page 23: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 23/154

Page 24: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 24/154

Page 25: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 25/154

Page 26: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 26/154

Page 27: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 27/154

Page 28: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 28/15428

 property  -

-

   

Scriviamo il codice necessario

inserito dall’utente e stampare il messaggio di benvenuto nella label predisposta. Spo-

Codice 1.2: Metodo “saluta:”

1

2

3

4

5

6

7

8

9

10

11

12

- (IBAction)saluta:(id)sender {  // leggiamo il nome inserito dall’utente  NSString *nome = self.fieldNome.text; 

if (nome.length == 0) {  // l’utente non ha inserito nessun nome  self.labelSaluto.text = @”Ciao Anonimo!”;  } else {  // salutiamo l’utente con il nome che ha inserito  self.labelSaluto.text = [NSString stringWithFormat:@”Ciao%@”,nome];  }}

Nota: 

-

-

alla vostra classe. Inserite il seguente codice:

Page 29: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 29/15429

C A P I T O L O   1

H e l l o W o r l d

  -

-

un valore. Ovviamente inseriamo due messaggi di saluto diversi a seconda del caso.

-

@“Ciao %@”,nome

-

-

  Run

Nascondiamo la tastiera -

Codice 1.3: Nascondere la tastiera passaggio 1

1 @interface ViewController : UIViewController <UITextFieldDelegate>

  -

tare il delegato della classe UITextField. Parleremo più avanti di cosa siano i delegati,

questo metodo:

Codice 1.4: Nascondere la tastiera passaggio 2

1

2

3

4

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

Page 30: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 30/154

Page 31: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 31/154

Page 32: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 32/154

Page 33: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 33/154

Page 34: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 34/154

Page 35: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 35/15435

C A P I T O L O   2

E l e m e n t i P r i n c i p a l i

-

-

-

Il codice della vostra classe dovrebbe essere questo:

Codice 2.1: File di interfaccia ViewController.h

1

2

3

4

5

6

7

8

9

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIImageView *immagine;

- (IBAction)cambiaAlpha:(id)sender;- (IBAction)cambiaImmagine:(id)sender;- (IBAction)visualizzaAlpha:(id)sender;

@end

Nota:

Semplice, perché utilizzeremo il parametro “sender” dei rispettivi metodi.

Possiamo ora passare alla scrittura del codice.

Page 36: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 36/154

Page 37: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 37/15437

Eccoli:

Codice 2.3: 

Codice 2.4: Metodo per la visualizzazione dell’alpha

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1

2

- (IBAction)cambiaAlpha:(id)sender {  // associamo il sender ad un elemento UISlider  UISlider *sliderAlpha = (UISlider*)sender;  // modifichiamo il valore alpha dell’immagine  self.immagine.alpha = sliderAlpha.value;}

- (IBAction)cambiaImmagine:(id)sender {  // associamo il sender ad un elemento UISegmentedControl  UISegmentedControl *seg = (UISegmentedControl*)sender;  // creiamo il nome dell’immagine da caricare  NSString *nomeImmagine = [NSString stringWithFormat:@”immagine%i.

png”,seg.selectedSegmentIndex+1];  // carichiamo l’immagine voluta dall’utente  self.immagine.image = [UIImage imageNamed:nomeImmagine];}

- (IBAction)visualizzaAlpha:(id)sender {  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”Alpha” message:[NSString stringWithFormat:@”Ilvalore della trasparenza è: %f”,self.immagine.alpha] delegate:nilcancelButtonTitle:@”Ok” otherButtonTitles:nil, nil];  [alert show];}

-

-

-

Manca ora solo un ultimo metodo:

C A P I T O L O   2

E l e m e n t i P r i n c i p a l i

Page 38: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 38/154

Page 39: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 39/154

Page 40: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 40/154

Page 41: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 41/15441

Codice 3.1: File di interfaccia ViewController.h

1

2

3

4

5

6

7

8

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIImageView *imageLogo;@property (strong, nonatomic) IBOutlet UIImageView *imageCestino;

- (IBAction)ripristinaLogo:(id)sender;

@end

Implementiamo il movimento del logo

Codice 3.2:   

1

2

3

4

5

6

7

8

9

10

11

12

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {  BOOL cancellato;

}

@property (strong, nonatomic) IBOutlet UIImageView *imageLogo;@property (strong, nonatomic) IBOutlet UIImageView *imageCestino;

- (IBAction)ripristinaLogo:(id)sender;

@end

  -minato.

Quindi, al valore YES corrisponderà il logo eliminato, a NO il logo sarà ancora visibile.

C A P I T O L O   3

 

Page 42: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 42/15442

 

Codice 3.3: Implementazione dei vari metodi 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  // ricaviamo i tocchi fatti dall’utente  UITouch *touch = [[event allTouches] anyObject];  // controlliamo che il tocco sia stato sull’oggetto del logo  if ([touch view] == imageLogo) {  imageLogo.center = [touch locationInView:self.view];  }}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  // controlliamo se il logo interseca il cestino

  if (CGRectIntersectsRect([imageLogo frame], [imageCestino frame])) {  // cambiamo l’immagine del cestino  imageCestino.image = [UIImage imageNamed:@”TrashIconFull.png”];  cancellato = YES;  // eseguiamo l’animazione per far sparire il logo  [UIView beginAnimations:nil context:NULL];  [UIView setAnimationDuration:0.5];  imageLogo.transform = CGAffineTransformMakeScale(.001, .001);  [UIView commitAnimations];  } else {

  // il logo non interseca il cestino, riportiamolo alla po-sizione iniziale  [UIView beginAnimations:nil context:NULL];  [UIView setAnimationDuration:0.5];  imageLogo.center = CGPointMake(158.0, 147.0);  [UIView commitAnimations];  }}

-

movimento sulla vista.

-

- muovessimo su un piano.

-

Page 43: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 43/15443

-

-

-

-

-

-

Codice 3.4: Implementazione di “ripristinaLogo:”

1

2

3

4

5

6

7

8

9

10

11

12

13

- (IBAction)ripristinaLogo:(id)sender {  // controlliamo se il logo è stato eliminato  if (cancellato) {  cancellato = NO;  // riportiamo il logo in posizione iniziale e svuotiamoil cestino

  [UIView beginAnimations:nil context:NULL];  [UIView setAnimationDuration:0.5];  imageLogo.transform = CGAffineTransformIdentity;  imageCestino.image = [UIImageimageNamed:@”TrashIconEmpty.png”];  imageLogo.center = CGPointMake(158.0, 147.0);  [UIView commitAnimations];  }}

-

 

C A P I T O L O   3

 

Page 44: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 44/154

Page 45: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 45/154

Page 46: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 46/154

Page 47: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 47/154

Page 48: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 48/154

Page 49: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 49/154

Page 50: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 50/154

Page 51: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 51/15451

Scriviamo il codice per aprire la pagina desiderata

dalla prima vista in base al bottone premuto dall’utente.

Codice 4.3: Stringa dell’indirizzo web

Codice 4.4: Caricamento della pagina web

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

56

7

8

9

10

11

12

#import <UIKit/UIKit.h>

@interface BrowserViewController : UIViewController {  NSString *indirizzo;}

@property (strong, nonatomic) NSString *indirizzo;

@property (strong, nonatomic) IBOutlet UIWebView *webView;

- (IBAction)tornaAdHome:(id)sender;

@end

@synthesize webView;@synthesize indirizzo;

- (void)viewWillAppear:(BOOL)animated{

  // creiamo un oggetto NSURL con l’indirizzo della pagina da caricare  NSURL *url = [NSURL URLWithString:indirizzo];  // creiamo una richiesta per la pagina  NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];  // visualizziamo la richiesta (la pagina) nella web view  [webView loadRequest:request];}

quando la vista sta per apparire.

Ecco il codice da inserire:

   synthesize - Davvero semplice e veloce.

C A P I T O L O   4

M u l t i B r o w s e r

Page 52: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 52/15452

Gestiamo il passaggio tra le due viste

Ora ci manca solo la gestione del passaggio tra le due viste. Per prima cosa ci occu-

piamo del codice necessario per passare dalla prima vista alla seconda.

Codice 4.5: Passaggio dalla prima alla seconda vista

1

2

3

4

5

6

7

8

9

10

11

12

13

14

- (IBAction)apriSito:(id)sender{  UIButton *bottone = (UIButton*)sender; 

BrowserViewController *viewBrowser = [[BrowserViewControlleralloc] initWithNibName:@”BrowserViewController” bundle:nil];

  viewBrowser.modalTransitionStyle = UIModalTransitionStyle-FlipHorizontal; 

if (bottone.tag == 1) {  viewBrowser.indirizzo = @”http://www.bubidevs.net”;  } else if (bottone.tag == 2){  viewBrowser.indirizzo = @”http://www.google.it”;  } 

[self presentModalViewController:viewBrowser animated:YES];}

abbiamo già fatto nel precedente capitolo), per poterne leggere la proprietà tag.

  deve essere caricato.

UIModalTransitionStyleCoverVertical , il caricamento della nuova vista sarà vertica-

UIModalTransitionStyleFlipHorizontal  -

UIModalTransitionStyleCrossDissolve

-

nito nella classe BrowserViewController) a seconda del bottone premuto dall’utente.

come avevamo detto.

visibile all’utente.

Page 53: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 53/15453

BrowserViewController. Per correggere questo problema dobbiamo eseguire l’im-

Codice 4.6: Importiamo la classe BrowserViewController 

Codice 4.7: Tornare alla prima vista

1

2

3

4

1

2

3

#import “ViewController.h”#import “BrowserViewController.h”

@implementation ViewController

- (IBAction)tornaAdHome:(id)sender {  [self dismissModalViewControllerAnimated:YES];}

 

 

C A P I T O L O   4

M u l t i B r o w s e r

Page 54: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 54/154

Page 55: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 55/154

Page 56: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 56/15456

dataSource delegate

dataSource, come dice il nome stesso, è la sorgente dei dati, e deve essere col-

delegate

tabella da parte dell’utente.

-

gate con la classe preposta alla gestione della tabella.

Scriviamo il codice necessario

Codice 5.1: 

Codice 5.2: Implementazione del “viewDidLoad”

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

#import <UIKit/UIKit.h>

@class DetailViewController;

@interface MasterViewController : UITableViewController {  NSMutableArray *lista;}

@property (strong, nonatomic) DetailViewController *detailViewController;

@end

- (void)viewDidLoad {  [super viewDidLoad]; 

// settiamo il titolo della vista  self.title = @”Prodotti Apple”; 

// elementi della tabella  lista = [[NSMutableArray alloc] initWithObjects: @”iPho-ne”, @”iPod”,@”iPod Touch”,@”iPad”,@”iMac”, @”iBook”, @”MacBook”,@”MacBook Pro”, @”Mac Pro”, @”PowerBook”, nil];}

   mutable -

i dettagli di un oggetto, come vedremo più avanti.

-

Page 57: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 57/15457

  -

nostra tabella.

Codice 5.3: 

1

23

4

5

6

7

8

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{  return 1;}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  return [lista count];}

 numberOfSectionsInTableView:

tableView: numberOfRowsInSection:

-

questo lo trovate già nella vostra classe).

C A P I T O L O   5

 

Page 58: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 58/154

Page 59: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 59/154

Page 60: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 60/154

Page 61: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 61/15461

Parte 2: Inseriamo alcune funzionalità

  e l’apertura della vista di dettaglio.

Permettiamo la cancellazione di una riga

Codice 5.6: Permettiamo la cnacellazione di una riga

1

2

3

10

11

12

- (void)viewDidLoad {  [super viewDidLoad]; 

... 

// permettiamo la modifica di una cella  self.navigationItem.rightBarButtonItem = self.editButtonItem;}

- alle API fornite da Apple.

-

tato il codice vero e proprio per eliminare un elemento della tabella.

tableView: com-

 

Codice 5.7: Cancellazione di un elemento

1

2

3

4

5

6

7

8

9

10

11

// Override to support editing the table view.- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {  if (editingStyle == UITableViewCellEditingStyleDelete) {  // eliminiamo l’elemento dalla lista

[lista removeObjectAtIndex:indexPath.row];  // eliminiamo la cella dalla tabella  [tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

  } else if (editingStyle == UITableViewCellEditingStyleInsert) {  // Create a new instance of the appropriate class, insertit into the array, and add a new row to the table view.  }}

C A P I T O L O   5

 

Page 62: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 62/15462

Come possiamo notare dalla struttura un po’ complicata, questo è un metodo del

-

-

Codice 5.8: Metodo che gestisce la selezione di una cella

1

2

3

4

5

6

7

8

9

10

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  if (!self.detailViewController) {  self.detailViewController = [[DetailViewController alloc]initWithNibName:@”DetailViewController” bundle:nil];  }  // passiamo l’oggetto selezionato  self.detailViewController.detailItem = [listaobjectAtIndex:indexPath.row];  // apriamo la vista  [self.navigationController pushViewController:self.detail-ViewController animated:YES];}

Nota:

due istruzioni otterreste un crash della vostra applicazione!

La vista di dettaglio

-

dall’utente) alla vista di dettaglio.

Page 63: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 63/154

Page 64: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 64/154

Page 65: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 65/154

Page 66: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 66/15466

questa nuova lista.

Codice 5.10: Inizializzazione della nuova lista

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

- (void)viewDidLoad {  [super viewDidLoad]; 

// settiamo il titolo della vista  self.title = @”Prodotti Apple”; 

// elementi della tabella  lista = [[NSMutableArray alloc] initWithObjects: @”iPho-ne”, @”iPod”,@”iPod Touch”,@”iPad”,@”iMac”, @”iBook”, @”MacBook”,@”MacBook Pro”, @”Mac Pro”, @”PowerBook”, nil]; 

// elementi per la lista filtrata  listaFiltrata = [[NSMutableArray alloc] initWithArray:lista]; 

// permettiamo la modifica di una cella  self.navigationItem.rightBarButtonItem = self.editButtonItem;}

Questa lista, ora, sarà il nuovo dataSource, infatti la tabella verrà popolata in base al

adattarsi a quanto appena detto:

Codice 5.11: 

Codice 5.12: 

1

2

3

1

2

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  return [listaFiltrata count];}

// Configure the cell.cell.textLabel.text = [listaFiltrata objectAtIndex:indexPath.row];

Page 67: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 67/15467

Codice 5.14: Cancellazione degli elementi in “lista”

Codice 5.13: 

1

2

3

4

5

6

7

89

1

2

// eliminiamo l’elemento dalla lista originale- (void)rimuoviElemento:(NSString*)item{  for (int i=0; i<[lista count]; i++) {  NSString *elemento = [lista objectAtIndex:i];  if ([elemento compare:item] == NSOrderedSame) {  [lista removeObjectAtIndex:i];  }

  }}

// passiamo l’oggetto selezionato

self.detailViewController.detailItem = [listaFiltrataobjectAtIndex:indexPath.row];

Codice 5.15:   

1

2

3

4

5

6

7

8

9

if (editingStyle == UITableViewCellEditingStyleDelete) {  // rimuovo dalla lista originale  [self rimuoviElemento:[listaFiltrata objectAtIndex:indexPath.row]];  // eliminiamo l’elemento dalla lista

[listaFiltrata removeObjectAtIndex:indexPath.row]; 

// eliminiamo la cella dalla tabella  [tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];}

-

-

- -

C A P I T O L O   5

 

Page 68: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 68/15468

Codice 5.16: Implementazione dell’algoritmo di ricerca

1

23

4

5

6

7

8

9

10

11

12

13

14

15

16

- (void)filterContentForSearchText:(NSString*)searchTextscope:(NSString*)scope{

 // rimuoviamo tutti gli elementi dalla lista filtrata

  [listaFiltrata removeAllObjects]; 

// controlliamo tutti gli elementi della lista se corrispondonoalla stringa di ricerca  NSString *elemento;  for (elemento in lista){  // eseguiamo il confronto  NSComparisonResult result = [elemento compare:searchTextoptions:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchTextlength])];

  // controlliamo se l’elemento corrisponde alla ricerca  if (result == NSOrderedSame){  [listaFiltrata addObject:elemento];  }  }}

Implementiamo la ricerca

-

Page 69: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 69/15469

Ecco il metodo da inserire:

Codice 5.17: Metodo per eseguire la ricerca ad ogni carattere inserito

1

2

3

4

5

- (BOOL)searchDisplayController:(UISearchDisplayController *)control-ler shouldReloadTableForSearchString:(NSString *)searchString{  [self filterContentForSearchText:searchString scope: [[self.sear-chDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 

// Return YES to cause the search result table view to be reloaded  return YES;}

Codice 5.18: Annullare la ricerca

1

2

3

4

5

- (void)searchBarCancelButtonClicked:(UISearchBar *)saearchBar {  [listaFiltrata removeAllObjects];  [listaFiltrata addObjectsFromArray:lista];  [self.tableView reloadData];}

Quando un utente annulla una ricerca semplicemente ripristiniamo la tabella con gli

 

C A P I T O L O   5

 

Page 70: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 70/154

Page 71: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 71/154

Page 72: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 72/154

Page 73: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 73/154

Page 74: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 74/154

Page 75: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 75/15475

   ABPeoplePickerNavigationControllerDelegate

Codice 6.3: Implementazione dell’azione “apriContatto:”

1

2

3

4

5

6

7

8

- (IBAction)apriContatto:(id)sender {  //Crea il picker  ABPeoplePickerNavigationController *picker = [[ABPeoplePicker-NavigationController alloc] init];  //Imposta il delegate del picker come vista principale

  picker.peoplePickerDelegate = self;  //Visualizza il picker  [self presentModalViewController:picker animated:YES];}

  apparire la vista del picker.

 peoplePickerNavigationController: shouldCon-

tinueAfterSelectingPerson:

C A P I T O L O   6

 

Page 76: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 76/15476

  -

- -

Prima di impostare la label dobbiamo eseguire un controllo: se nessun numero è pre-

Codice 6.4: Metodo per rispondere alla selezione di un contatto

1

2

34

5

6

7

8

9

10

1112

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigation-Controller *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

  // ricaviamo e impostiamo il nome  labelNome.text = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);  // ricaviamo e impostiamo il nome  labelCognome.text = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

// ricaviamo i numeri di telefono  ABMultiValueRef multi = ABRecordCopyValue(person, kABPer-sonPhoneProperty);  NSArray *numeri = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(multi); 

if ([numeri count] == 0) {  // nessun numero presente per il contatto  labelTelefono.text = @”---”;  } else {  labelTelefono.text = @””;  // stampiamo tutti i numeri di telefono  for (int i=0; i < [numeri count]; i++) {  labelTelefono.text = [NSString stringWithFor-mat:@”%@ \n%@”,labelTelefono.text,[numeri objectAtIndex:i]];  }  } 

// ricaviamo e visualizziamo l’immagine del contatto  NSData *imageData = (__bridge NSData*)ABPersonCopyImageData(person);  immagine.image = [UIImage imageWithData:imageData]; 

//Rimuove il controller “Contatti”  [self dismissModalViewControllerAnimated:YES];

return NO;}

Page 77: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 77/15477

-

riamo tutti nella label apposita.

-

-

  restano solo due veloci metodi da inserire:

Codice 6.5: Altri metodi del delegato del picker 1

2

3

4

5

6

7

8

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{  return NO;}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {  // facciamo tornare il controller alla vista principale

  [self dismissModalViewControllerAnimated:YES];}

-

-

ritorno per questo metodo.

-

 

C A P I T O L O   6

 

Page 78: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 78/154

Page 79: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 79/15479

C A P I T O L O   7

 X ML Tu t o r i a l

7. XML

Dopo aver visto la maggior parte dei componenti principali, vedremo nei prossi-

parlando di XML.

Cosa è XML

comportamento di altri linguaggi. Il linguaggio di markup più famoso è sicuramente

XML è l’acronimo di eXtensible Markup Language, da cui possiamo capire la carat-

XML 1: Esempio

<?xml version=”1.0” encoding=”ISO-8859-1”?><studenti>  <studente>  <matricola>000001</matricola>  <cognome>Rossi</cognome>  <nome>Paolo</nome>  </studente>

  <studente>  <matricola>000002</matricola>  <cognome>Verdi</cognome>  <nome>Francesco</nome>  </studente></studenti>

vanno a modellare dei dati a nostro piacimento.

-

Page 80: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 80/15480

Ci sono alcune piccole regole da rispettare nella struttura XML:

3) I tag non devono contenere errori di annidamento.

Ecco alcuni esempi errati:

XML 2: Esempi errati 

XML 3: Esempio

<rubrica>  <nome>Mario</nome>  <cognome>Rossi</rubrica>

<rubrica>  <nome>Mario</nome>  <cognome>Rossi</rubrica></cognome>

<rubrica>  <nome>Mario</nome>  <cognome>Rossi</COGNOME></rubrica>

<studenti>  <studente>  <matricola value=”000001” />  <cognome value=”Rossi” />  <nome value=”Paolo” />  </studente>  <studente>  <matricola value=”000002” />  <cognome value=”Verdi” />  <nome value=”Francesco” />  </studente></studenti>

-

Page 81: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 81/154

Page 82: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 82/154

Page 83: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 83/15483

Scriviamo il codice necessario

Prima di procedere con il codice necessario, dobbiamo inserire all’interno del pro-

-

pure creare copiando il codice presentato nella prima parte di questo tutorial tutorial)

Copy items intodestination group’s folder (if needed)

Codice 7.2: 

Codice 7.3: DImplementazione dell’azione “avviaParsing:”

1

2

3

45

6

7

8

9

1

2

3

4

5

67

8

9

10

11

12

13

14

15

16

17

18

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <NSXMLParserDelegate>

@property (strong, nonatomic) IBOutlet UITextView *viewTesto;

- (IBAction)avviaParsing:(id)sender;

@end

- (IBAction)avviaParsing:(id)sender {  // azzeriamo il contenuto della text view  [viewTesto setText:@””];  // definiamo il percorso del db  NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@”dati.xml”];

  // convertiamo il path del file in un NSURL  NSURL *xmlURL = [NSURL fileURLWithPath:path];

// creiamo il parserNSXMLParser *parser = [[ NSXMLParser alloc] initWithContentsOf

URL:xmlURL];// settiamo come delegato la classe stessa

  parser.delegate = self;// effettuiamo il parsing del file e controlliamo se ci sono

stati problemi  if([parser parse] == NO){  // errori nel parsing  UIAlertView *alert = [[UIAlertView alloc]

initWithTitle:@”Attenzione” message:@”Ci sono stati dei problemi nel par-sing del file” delegate:nil cancelButtonTitle:@”OK” otherButtonTitles: nil];  [alert show];  }}

 

C A P I T O L O   7

 X ML Tu t o r i a l

Page 84: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 84/15484

-

stato un qualsiasi errore, viene mostrato all’utente un messaggi di errore.

-

Codice 7.4: 

1

23

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)ele-mentName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary *)attributeDict {

 if ([elementName isEqualToString:@”studenti”]){

  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nInizio studenti”,viewTesto.text]];  }  else if([elementName isEqualToString:@”studente”]){  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nNuovo studente”,viewTesto.text]];  }  else if([elementName isEqualToString:@”matricola”]) {  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nMatricola: “,viewTesto.text]];

  }  else if([elementName isEqualToString:@”cognome”]) {  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nCognome: “,viewTesto.text]];  }

else if([elementName isEqualToString:@”nome”]) {  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nNome: “,viewTesto.text]];  }}

-

Page 85: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 85/15485

-

di cui non conosciamo la struttura interna.

elemento, cioè l’apertura di un tag.

Codice 7.5: Altri metodi del delegato NSXMLParser 

1

2

3

45

6

7

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@%@”,viewTesto.text,string]];}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)ele-mentName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qName {  [viewTesto setText:[[NSString alloc] initWithFormat:@”%@\nFineelemento: %@”,viewTesto.text,elementName]];}

 

una stringa nella text view.

 

C A P I T O L O   7

 X ML Tu t o r i a l

Page 86: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 86/154

Page 87: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 87/15487

C A P I T O L O   8

8. SQL

-

-

 Creeremo, quindi, una tabella in cui andremo ad inserire i valori letti dal nostro data-

-

In questa guida sentirete spesso parlare di SQLite, ma cosa è di preciso?

-

-

di avere un DMBS dedicato per la gestione delle basi di dati. Ovviamente fornisce un

Nota:

Page 88: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 88/154

Page 89: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 89/154

Page 90: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 90/154

Page 91: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 91/154

Page 92: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 92/154

Page 93: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 93/154

Page 94: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 94/154

Page 95: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 95/154

Page 96: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 96/15496

-

deve fare questa classe.

Essa avrà il compito di:

-

Codice 8.1: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#import <Foundation/Foundation.h>#import <sqlite3.h>

@interface Data : NSObject {  NSString *pathDB;

  NSMutableArray *lista;}

@property (nonatomic, retain) NSMutableArray *lista;

- (void)caricaValori;- (void)cancellaSquadra:(NSMutableDictionary*)squadra;- (void)aggiungiSquadra:(NSMutableDictionary*)squadra;

@end

  in Cocoa.

-

menti letti dal database.

Page 97: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 97/15497

Codice 8.2: Implementazione del metodo “init”

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#import “Data.h”

static sqlite3 *database = nil;

@implementation Data

@synthesize lista;

- (id)init{  self = [super init];  if (self) {  // definiamo il percorso del db

  pathDB = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@”squadre.sqlite”];  // leggiamo tutti gli elementi  [self caricaValori];  }  return self;}

  -

-

 

-

cedente capitolo.

-

menti dal database. Nella pagina successiva troverete il codice da inserire per la sua

C A P I T O L O   8

Page 98: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 98/15498

  sarà una lista temporanea in cui inseriremo uno alla volta gli elementi letti dal databa-

se. Questa lista, poi, diventerà proprio la lista degli oggetti della nostra classe.

 Alla riga 6 viene aperta la connessione con il database: essa si trova all’interno di un

Codice 8.3: Implementazione del metodo “caricaValori”

1

2

3

45

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// Carica i valori dal database passato come parametro- (void)caricaValori {  // lista temporanea

  NSMutableArray *listaTemp = [[NSMutableArray alloc] init]; if (sqlite3_open([pathDB UTF8String], &database) == SQLITE_OK)

{  // query che ricava i valori  const char *sql = “SELECT id, squadra, nazione FROMsquadre”;  sqlite3_stmt *select_statement; 

if(sqlite3_prepare_v2(database, sql, -1, &select_state-ment, NULL) == SQLITE_OK) {  while(sqlite3_step(select_statement) == SQLITE_

ROW) {  // ricaviamo i valori letti dalla query  NSString *idSquadra = [NSStringstringWithUTF8String:(char *)sqlite3_column_text(select_statement,0)];  NSString *nome = [NSStringstringWithUTF8String:(char *)sqlite3_column_text(select_statement,1)];  NSString *nazione = [NSStringstringWithUTF8String:(char *)sqlite3_column_text(select_statement,2)];  // inseriamo tutti i valori letti in un uni-co oggetto  NSDictionary *dictionary = [[NSMutable-Dictionary alloc] initWithObjectsAndKeys:idSquadra, @”id”, nome,@”squadra”, nazione, @”nazione”, nil];  [listaTemp addObject:dictionary];  }  }  self.lista = listaTemp;  sqlite3_finalize(select_statement);  }  sqlite3_close(database);

}

Page 99: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 99/15499

-

   

-to comodo e veloce inserire e recuperare oggetti.

-

rati da questo tipo di oggetto.

dal database.

Il procedimento potrebbe sembrarvi un po’ complicato, ma in linea generale è sem- -milare bene i concetti.

-

Mostriamo i valori del database

già visti.

Codice 8.4: 

1

2

3

4

5

6

7

8

9

10

11

12

13

#import <UIKit/UIKit.h>#import “Data.h”

@class DetailViewController;

@interface MasterViewController : UITableViewController {  Data *dataList;}

@property (strong, nonatomic) DetailViewController *detailViewCon-troller;

@end

-

-

C A P I T O L O   8

Page 100: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 100/154100

Codice 8.6: 

Codice 8.5: Implementazione del metodo “viewDidLoad”

1

2

3

4

5

6

7

8

9

10

1112

13

14

15

16

17

18

19

20

21

22

23

1

2

3

4

5

6

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  return [dataList.lista count];}

// Customize the appearance of table view cells.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  static NSString *CellIdentifier = @”Cell”;

 UITableViewCell *cell = [tableView dequeueReusableCellWithIden

tifier:CellIdentifier];  if (cell == nil) {  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];  cell.accessoryType = UITableViewCellAccessoryDisclosu-reIndicator;  }

  // Configure the cell.  NSMutableDictionary *squadra = [dataList.listaobjectAtIndex:indexPath.row];  cell.textLabel.text = [squadra objectForKey:@”squadra”];  cell.detailTextLabel.text = [squadra objectForKey:@”nazione”];  return cell;}

- (void)viewDidLoad {  [super viewDidLoad]; 

// inizializziamo l’oggetto Data  dataList = [[Data alloc] init];}

Page 101: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 101/154

Page 102: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 102/154102

Cancellazione di un elemento

-

-

 

Codice 8.7: 

1

2

3

4

5

6

7

8

9

10

1112

13

14

15

16

17

18

19

20

21

- (void)cancellaSquadra:(NSMutableDictionary*)squadra{ 

if (sqlite3_open([pathDB UTF8String], &database) == SQLITE_OK){  // query per la cancellazione di una squadra  NSString *query = [NSString stringWithFormat:@”DELETEFROM squadre WHERE id=%@”,[squadra objectForKey:@”id”]];  const char *sql = [query UTF8String]; 

sqlite3_stmt *delete_statement;  // eseguiamo la query  if(sqlite3_prepare_v2(database, sql, -1, &delete_state-ment, NULL) == SQLITE_OK) {

 if(sqlite3_step(delete_statement) == SQLITE_DONE) {

  // tutto ok, ricarichiamo la lista  [self caricaValori];  }

}  // chiudiamo il db  sqlite3_finalize(delete_statement);  }  sqlite3_close(database);}

  -

ricare tutti i valori.Decidete voi quale sistema preferite.

Sicuramente ricaricare tutti gli elementi dal database è più dispendioso in termini di

presenti nel database.

Page 103: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 103/154103

Codice 8.8: 

1

2

3

4

5

6

7

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath {  if (editingStyle == UITableViewCellEditingStyleDelete) {  [dataList cancellaSquadra:[dataList.listaobjectAtIndex:indexPath.row]];  // Delete the row from the data source.  [tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];  }}

- -

correttamente.

C A P I T O L O   8

Page 104: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 104/154

Page 105: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 105/154105

Inserimento di un nuovo elemento

- -

Codice 8.7: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

- (void)aggiungiSquadra:(NSMutableDictionary*)squadra{ 

if (sqlite3_open([pathDB UTF8String], &database) == SQLITE_OK){  // query per l’inserimento del nuovo giocatore  NSString *query = [NSString stringWithFormat:@”INSERTINTO squadre (squadra, nazione) VALUES (‘%@’,’%@’)”,[squadra objectForKey:@”squadra”],[squadra objectForKey:@”nazione”]];  const char *sql = [query UTF8String]; 

sqlite3_stmt *insert_statement;  // eseguiamo la query

  if(sqlite3_prepare_v2(database, sql, -1, &insert_state-ment, NULL) == SQLITE_OK) {  if(sqlite3_step(insert_statement) == SQLITE_DONE) {  // ricarichiamo la lista  [self caricaValori];  } 

}  // chiudiamo il db  sqlite3_finalize(insert_statement);  }

sqlite3_close(database);

}

-

-

come tipologia.

C A P I T O L O   8

Page 106: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 106/154

Page 107: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 107/154107

Codice 8.8: 

Codice 8.9: synthesize dell’elemento dataList 

12

3

4

5

6

7

8

9

10

11

12

1

2

3

4

56

7

#import <UIKit/UIKit.h>#import “Data.h”

@interface AddSquadraViewController : UIViewController

@property (assign, nonatomic) Data *dataList;@property (strong, nonatomic) IBOutlet UITextField *fieldNome;@property (strong, nonatomic) IBOutlet UITextField *fieldNazione;

- (IBAction)addSquadra:(id)sender;

@end

#import “AddSquadraViewController.h”

@implementation AddSquadraViewController

@synthesize dataList;@synthesize fieldNome;@synthesize fieldNazione;

C A P I T O L O   8

Page 108: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 108/154108

Implementiamo, poi, il metodo associato alla pressione del bottone:

Codice 8.10: Implementazione del metodo associato al bottone

Codice 8.11: 

12

3

4

5

6

7

8

9

10

11

12

13

14

1

2

3

4

5

6

7

8

9

10

- (IBAction)addSquadra:(id)sender {  // controlliamo se i campi sono stati inseriti  if (([fieldNome.text length] != 0)&& ([fieldNazione.textlength] != 0)){  // creiamo un dizionario con i valori  NSMutableDictionary *squadra = [[NSMutableDictionary al-loc] initWithObjectsAndKeys:fieldNome.text, @”squadra”, fieldNazio-ne.text, @”nazione”, nil];  // inseriamolo nel db  [dataList aggiungiSquadra:squadra];  // torniamo alla lista  [self.navigationController popViewControllerAnimated:YES];

  } else {  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”Attenzione” message:@”Controlla di aver inseritotutti i campi necessari” delegate:nil cancelButtonTitle:@”OK” other-ButtonTitles: nil];  [alert show];  }}

- (void)viewDidLoad {  [super viewDidLoad]; 

// inizializziamo l’oggetto Data  dataList = [[Data alloc] init]; 

// bottone per aggiungere una nuova squadra

  UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(aggiungiSquadra:)];  self.navigationItem.rightBarButtonItem = addButton;}

- -

  -

Page 109: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 109/154109

  -

 

Codice 8.12: 

Codice 8.13: 

1

2

3

4

5

1

2

3

4

5

6

- (void)aggiungiSquadra:(id)sender{  AddSquadraViewController *addController = [[AddSquadra-ViewController alloc] initWithNibName:@”AddSquadraViewController”bundle:nil];  addController.dataList = dataList;  [self.navigationController pushViewController:addController

animated:YES];}

- (void)viewWillAppear:(BOOL)animated {  [super viewWillAppear:animated]; 

// ricarichiamo la tabella  [self.tableView reloadData];}

-

- visibile all’utente.

 

C A P I T O L O   8

Page 110: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 110/154

Page 111: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 111/154111

C A P I T O L O   9

R S S R e a d e r

9. Creiamo un semplice lettore di feed RSS

-

Parte 1: Creiamo la base del lettoreCreiamo la struttura dell’applicazione

- valori letti dal feed RSS.

Codice 9.1: 

1

2

3

4

5

6

78

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#import <UIKit/UIKit.h>

@class DetailViewController;

@interface MasterViewController : UITableViewController <NSXMLParser-Delegate>{  // lista di tutti gli elementi letti dal feed

  NSMutableArray *listaElementi;  // variabile temporanea per un singolo elemento  NSMutableDictionary *itemCorrente;  // variabili temporanee per i singoli campi  NSMutableString *elementoCorrente;  NSMutableString *titolo;  NSMutableString *data;  NSMutableString *link;  NSMutableString *contenuto;}

- (void)parseRSSFeed:(NSString*)feed;

@property (strong, nonatomic) DetailViewController *detailViewCon-troller;

@end

Page 112: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 112/154112

-

-

Codice 9.3: Implementazione del metodo “parseRSSFeed:”

Codice 9.2: Imlementazione del metodo “viewDidLoad”

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

1

2

3

4

5

6

7

8

- (void)parseRSSFeed:(NSString*)feed{  // inizializziamo la lista degli elementi letti dal feed  listaElementi = [[NSMutableArray alloc] init]; 

// dobbiamo convertire la stringa “feed” in un elemento“NSURL”  NSURL *feedURL = [NSURL URLWithString:feed]; 

// inizializziamo il nostro parser XML  NSXMLParser *rssParser = [[NSXMLParser alloc]initWithContentsOfURL:feedURL]; 

// settiamo alcune proprietà  [rssParser setDelegate:self];  [rssParser setShouldProcessNamespaces:NO];  [rssParser setShouldReportNamespacePrefixes:NO];  [rssParser setShouldResolveExternalEntities:NO]; 

// avviamo il parsing del feed RSS  [rssParser parse];}

- (void)viewDidLoad {  [super viewDidLoad]; 

// impostiamo l’indirizzo del feed RSS  NSString *path = @”http://feeds.feedburner.com/TheBubiDevs”;  // richiamiamo il metodo che avvierà il parser  [self parseRSSFeed:path];}

- -

Page 113: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 113/154113

-

Esse sono necessarie per la corretta lettura di un feed RSS, quindi non mi dilungo

-

Codice 9.4: Implementazione del metodo che rileva i nuovi elementi 

1

2

3

4

5

6

7

8

9

10

11

12

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)ele-

mentName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{

elementiCorrente = [elementName copy];  if ([elementName isEqualToString:@”item”]) {  // inizializza tutti gli elementi  itemCorrente = [[NSMutableDictionary alloc] init];  titolo = [[NSMutableString alloc] init];  data = [[NSMutableString alloc] init];  contenuto = [[NSMutableString alloc] init];  link = [[NSMutableString alloc] init];  }

}

-

-

 

C A P I T O L O   9

R S S R e a d e r

Page 114: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 114/154114

-

-

ve, in modo da poter recuperare i singoli valori in modo semplice e veloce.

Per completare il parser ci mancano solo due metodi:

Codice 9.5: 

Codice 9.6:   

1

23

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString*)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName{

if ([elementName isEqualToString:@”item”]) {  // inseriamo tutti i valori letti nell’elemento itemCor-rente  [itemCorrente setObject:titolo forKey:@”titolo”];  [itemCorrente setObject:link forKey:@”link”];  [itemCorrente setObject:contenuto forKey:@”contenuto”];  [itemCorrente setObject:data forKey:@”data”]; 

// inseriamo l’elemento nella lista degli elementi  [listaElementi addObject:[itemCorrente copy]];  }

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{;  // salva i caratteri per l’elemento corrente  if ([elementoCorrente isEqualToString:@”title”]){  [titolo appendString:string];  } else if ([elementoCorrente isEqualToString:@”link”]) {  [link appendString:string];

  } else if ([elementoCorrente isEqualToString:@”description”]) {  [contenuto appendString:string];  } else if ([elementoCorrente isEqualToString:@”pubDate”]) {  [data appendString:string];  }}

- (void) parserDidEndDocument:(NSXMLParser *)parser {  [self.tableView reloadData];}

Page 115: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 115/154115

- carattere in coda a quelli già letti dello stesso elemento, in modo da ricostruire l’in-

-

ricare i propri dati, mostrando gli elementi letti dal feed.

 Visualizziamo gli elementi nella tabella

ricavato dal feed RSS. Ormai dovreste essere pratici con le table view, quindi eccovii vari metodi da impostare:

Codice 9.7: Impostazione della tabella

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  return [listaElementi count];}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  static NSString *CellIdentifier = @”Cell”; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  if (cell == nil) {  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  cell.accessoryType = UITableViewCellAccessoryDisclosu-reIndicator;

  }

  // Configure the cell.  NSMutableDictionary *elemento = [listaElementiobjectAtIndex:indexPath.row];  cell.textLabel.text = [elemento objectForKey:@”titolo”];  return cell;}

-

 

C A P I T O L O   9

R S S R e a d e r

Page 116: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 116/154

Page 117: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 117/154

Page 118: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 118/154

Page 119: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 119/154119

Codice 9.8: Inserimento delle synthesize

Codice 9.9:   

1

2

3

4

5

6

7

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

2627

#import “FeedCell.h”

@implementation FeedCell

@synthesize labelTitolo;@synthesize labelContenuto;@synthesize labelData;

#import <UIKit/UIKit.h>#import “FeedCell.h”

@class DetailViewController;

@interface MasterViewController : UITableViewController <NSXMLParser-Delegate>{  // lista di tutti gli elementi letti dal feed  NSMutableArray *listaElementi;  // variabile temporanea per un singolo elemento  NSMutableDictionary *itemCorrente;  // variabili temporanee per i singoli campi  NSMutableString *elementoCorrente;  NSMutableString *titolo;  NSMutableString *data;

  NSMutableString *link;  NSMutableString *contenuto; 

// cella personalizzata  FeedCell *itemCell;}

- (void)parseRSSFeed:(NSString*)feed;

@property (strong, nonatomic) IBOutlet FeedCell *itemCell;@property (strong, nonatomic) DetailViewController *detailViewCon-troller;

@end

C A P I T O L O   9

R S S R e a d e r

Page 120: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 120/154

Page 121: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 121/154

Page 122: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 122/154

Page 123: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 123/154

Page 124: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 124/154124

Diversamente dalle altre volte in cui abbiamo lavorato con le table view, questa volta

-

una normale proprietà dell’oggetto cell, e viene impostato il contenuto desiderato.

occupare troppa memoria inutilmente.

L’oggetto data, volendo, potrebbe essere convertito in un formato a noi più familiare,

 

Codice 9.10: 

1

2

34

5

6

7

8

9

10

11

1213

14

15

16

17

18

19

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  static NSString *CellIdentifier = @”FeedCell”;

  FeedCell *cell = (FeedCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];  if (cell == nil) { 

// carichiamo il nib della cella e assegniamolo allacella corrente  [[NSBundle mainBundle] loadNibNamed:@”FeedCell”owner:self options:NULL];  cell = itemCell;  }

  // Configure the cell.  NSMutableDictionary *elemento = [listaElementiobjectAtIndex:indexPath.row];  cell.labelTitolo.text = [elemento objectForKey:@”titolo”];  cell.labelContenuto.text = [[elementoobjectForKey:@”contenuto”] substringToIndex:80];  cell.labelData.text = [elemento objectForKey:@”data”];

  return cell;}

Page 125: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 125/154

Page 126: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 126/154

Page 127: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 127/154127

Ecco come deve essere la vostra classe:

Codice 9.11: File di interfaccia DetailViewController.h

Codice 9.12:

12

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

910

11

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController

@property (strong, nonatomic) id detailItem;

@property (strong, nonatomic) IBOutlet UIWebView *webView;@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLa-bel;

@end

- (void)configureView {  // Update the user interface for the detail item.

  if (self.detailItem) {  NSURL *url = [NSURL URLWithString:self.detailItem];  // creiamo una richiesta per la pagina  NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];  // visualizziamo la richiesta (la pagina) nella web view

  [self.webView loadRequest:request];  }}

  -

-

vista di dettaglio.

10.13 nella pagina successiva.

C A P I T O L O   9

R S S R e a d e r

Page 128: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 128/154128

  -

Codice 9.13: Passiamo il link dell’articolo da visualizzare

1

2

3

4567

89

10

11

12131415

16

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  if (!self.detailViewController) {

  self.detailViewController = [[DetailViewController al-loc] initWithNibName:@”DetailViewController” bundle:nil];  } 

// ricaviamo il link dell’elemento selezionato  NSString *linkDaAprire = [[listaElementiobjectAtIndex:indexPath.row] objectForKey: @”link”];  // ripuliamo il link da spazi, return e tabs  linkDaAprire = [linkDaAprire stringByReplacingOccurrence-sOfString:@” “ withString:@””];  linkDaAprire = [linkDaAprire stringByReplacingOccurrencesOfString:@”\n” withString:@””];

  linkDaAprire = [linkDaAprire stringByReplacingOccurrence-sOfString:@” “ withString:@””];  // passiamo il link alla vista di dettaglio  self.detailViewController.detailItem = linkDaAprire; 

[self.navigationController pushViewController:self.detail-ViewController animated:YES];}

Page 129: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 129/154

Page 130: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 130/154130

Page 131: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 131/154

Page 132: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 132/154

Page 133: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 133/154

Page 134: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 134/154134

  -viranno nel nostro programma. Ecco il codice da aggiungere:

Codice 10.2:  

1

2

3

45

6

7

8

9

10

11

12

13

14

15

16

#import “FlipsideViewController.h”

@interface MainViewController : UIViewController <FlipsideViewCon-trollerDelegate> {

  // ultimo punto salvato  CGPoint ultimoPunto;  // parametri del pennello  float dimensionePennello;  UIColor *colorePennello;}

@property (strong, nonatomic) IBOutlet UIImageView *viewDisegno;

- (IBAction)cancellaDisegno:(id)sender;- (IBAction)showInfo:(id)sender;

@end

  punto: le coordinate x e y. Questo ci servirà per sapere il punto precedente a quello

-

-

serve quando l’utente compie solo un singolo tap, disegnando così un semplice punto.

Page 135: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 135/154135

Codice 10.3:

Codice 10.4:

12

3

4

5

6

1

2

3

4

5

- (void)viewDidLoad {  [super viewDidLoad];  // settimo i valori di default del pennello  dimensionePennello = 5.0;  colorePennello = [UIColor colorWithRed:1.0 green:0.0 blue:0.0alpha:1.0];}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  // ricaviamo l’ultimo punto toccato dall’utente  UITouch *touch = [touches anyObject];  ultimoPunto = [touch locationInView:viewDisegno];}

-

Ecco il metodo da inserire:

-

-

C A P I T O L O   1 0

Page 136: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 136/154136

  - -

-

- -

 

Codice 10.5: 

1

2

3

45

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject];

CGPoint puntoCorrente = [touch locationInView:viewDisegno]; // definiamo il contest grafico

  UIGraphicsBeginImageContext(viewDisegno.frame.size);  [viewDisegno.image drawInRect:CGRectMake(0, 0, viewDisegno.frame.size.width, viewDisegno.frame.size.height)];  // settiamo la forma e la dimensione del pennello  CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCa-pRound);  CGContextSetLineWidth(UIGraphicsGetCurrentContext(), dimensio-nePennello);  // convertiamo il colore e impostiamolo come colore del pennello

  const CGFloat *components = CGColorGetComponents([colorePennello CGColor]);  CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), com-ponents[0], components[1], components[2], components[3]);  // disegna il percorso  CGContextBeginPath(UIGraphicsGetCurrentContext());  CGContextMoveToPoint(UIGraphicsGetCurrentContext(),ultimoPunto.x, ultimoPunto.y);  CGContextAddLineToPoint(UIGraphicsGetCurrentContext(),puntoCorrente.x, puntoCorrente.y);  CGContextStrokePath(UIGraphicsGetCurrentContext());  // settiamo il disegno appena creato  viewDisegno.image = UIGraphicsGetImageFromCurrentImageCon-text();  UIGraphicsEndImageContext(); 

ultimoPunto = puntoCorrente;}

Page 137: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 137/154137

rendendola così visibile all’utente.

dimenticare nulla.

-

Codice 10.6: Codice per disegnare un singolo punto

Codice 10.7: Implementazione del metodo “cancellaDisegno:”

1

2

3

4

1

2

3

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  // disegniamo un solo punto  [self touchesMoved:touches withEvent:event];}

- (IBAction)cancellaDisegno:(id)sender {  viewDisegno.image = nil;}

-

ro semplicissimo.

-

-

 

C A P I T O L O   1 0

Page 138: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 138/154

Page 139: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 139/154

Page 140: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 140/154

Page 141: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 141/154

Page 142: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 142/154142

Scriviamo il codice necessario

Codice 10.10:   

1

2

3

4

5

6

7

89

10

11

12

13

14

15

16

17

18

1920

21

22

23

24

25

26

27

28

29

30

31

#import <UIKit/UIKit.h>

@class FlipsideViewController;

@protocol FlipsideViewControllerDelegate- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller;@end

@interface FlipsideViewController : UIViewController {  // proprietà del pennello  UIColor *colorePennello;  float dimensionePennello;}

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDele-gate> delegate;@property (strong, nonatomic) IBOutlet UISlider *sliderRosso;@property (strong, nonatomic) IBOutlet UISlider *sliderBlu;@property (strong, nonatomic) IBOutlet UISlider *sliderVerde;

@property (strong, nonatomic) IBOutlet UISlider *sliderAlpha;@property (strong, nonatomic) IBOutlet UIImageView *viewColore;@property (strong, nonatomic) IBOutlet UILabel *labelDimensione;@property (strong, nonatomic) IBOutlet UISlider *sliderDimensione;// proprietà del pennello@property (strong, nonatomic) UIColor *colorePennello;@property (nonatomic, assign) float dimensionePennello;

- (IBAction)done:(id)sender;- (IBAction)cambiaColore:(id)sender;- (IBAction)cambiaDimensione:(id)sender;

@end

  -

-

-

 

-

Page 143: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 143/154143

Codice 10.11:

Codice 10.12:  

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

5

6

7

8

9

- (void)viewDidLoad {  [super viewDidLoad];  // settiamo gli elementi con il valore attuale del pennello  const CGFloat *components = CGColorGetComponents([colorePennello CGColor]);  [self.sliderRosso setValue:components[0]];  [self.sliderVerde setValue:components[1]];  [self.sliderBlu setValue:components[2]];  [self.sliderAlpha setValue:components[3]];  [self.viewColore setBackgroundColor:colorePennello];  self.labelDimensione.text = [NSString stringWithFormat:@”%f”,dimensionePennello];  [self.sliderDimensione setValue:dimensionePennello];}

- (IBAction)cambiaColore:(id)sender {  // impostiamo il colore nella image view  [self.viewColore setBackgroundColor:[UIColorcolorWithRed:self.sliderRosso.value green:self.sliderVerde.valueblue:self.sliderBlu.value alpha:self.sliderAlpha.value]];}

- (IBAction)cambiaDimensione:(id)sender {  // impostiamo la label con la dimensione del pennello  self.labelDimensione.text = [NSStringstringWithFormat:@”%f”,self.sliderDimensione.value];}

   

  nostro pennello.

nella label predisposta.

semplici) da implementare:

C A P I T O L O   1 0

Page 144: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 144/154144

-tare lo sfondo dell’immagine con l’UIColor corrispondente. Il secondo metodo lavora

Codice 10.13:

Codice 10.14:

1

2

3

4

5

1

2

3

- (IBAction)done:(id)sender {  dimensionePennello = self.sliderDimensione.value;  colorePennello = [UIColor colorWithRed:self.sliderRosso.valuegreen:self.sliderVerde.value blue:self.sliderBlu.value alpha:self.sliderAlpha.value];  [self.delegate flipsideViewControllerDidFinish:selfnuovoColore:colorePennello nuovaDimensione:dimensionePennello];}

@protocol FlipsideViewControllerDelegate- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller nuovoColore:(UIColor*)colore nuovaDimensione:(float)di-mensione;@end

 Abbiamo semplicemente letto il valore della dimensione e del colore del pennello, per

-

  -

vostra classe come vedete in Codice 10.15 nella pagina successiva.

Page 145: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 145/154145

-

Codice 10.15:

1

23

4

5

6

7

8

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller nuovoColore:(UIColor*)colore nuovaDimensione:(float)di-mensione{

  // aggiorniamo le proprietà del pennello  const CGFloat *components = CGColorGetComponents([colore CGCo-lor]);  colorePennello = [UIColor colorWithRed:components[0]green:components[1] blue:components[2] alpha:components[3]];  dimensionePennello = dimensione;  // chiudiamo la vista delle impostazioni  [self dismissModalViewControllerAnimated:YES];}

Codice 10.16:

1

2

3

4

5

6

7

8

9

10

- (IBAction)showInfo:(id)sender {FlipsideViewController *controller = [[FlipsideViewController

alloc] initWithNibName:@”FlipsideViewController” bundle:nil];  controller.delegate = self;  controller.modalTransitionStyle = UIModalTransitionStyleFlipHo-rizontal;  // passiamo i valori attuali del pennello  controller.dimensionePennello = dimensionePennello;  controller.colorePennello = colorePennello;  // visualizziamo la vista delle impostazioni  [self presentModalViewController:controller animated:YES];}

 

  -

C A P I T O L O   1 0

Page 146: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 146/154

Page 147: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 147/154

Page 148: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 148/154148

necessario per salvare l’immagine nella galleria dell’utente.

Codice 10.18: Codice per salvare l’immagine nella galleria

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

- (IBAction)salvaDisegno:(id)sender {  // salviamo l’immagine nel rullino  UIImageWriteToSavedPhotosAlbum(viewDisegno.image, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextIn-fo:), nil);}

- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

NSString *messaggio;NSString *titolo;// controlliamo se c’è stato un errore nel messaggio

  if (!error) {titolo = @”Salvataggio”;messaggio = @”Immagine salvata con successo”;

  } else {titolo = @”Errore”;messaggio = [error description];

}// visualizziamo un’alert mostrando l’esito del salvataggio

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titolo

message:messaggio delegate:nil cancelButtonTitle:@”OK”otherButtonTitles:nil];[alert show];

}

-

-

il salvataggio si è concluso correttamente oppure se ci sono stati degli errori. Tutto

  -

Page 149: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 149/154

Page 150: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 150/154

Page 151: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 151/154151

C O N C L U S I O N I

Conclusioni

programmatori per dispositivi iOS. Avete avuto, comunque, un’ampia panoramica

continuare la vostra avventura in questo mondo dovrete provare, studiare, navigare

alla ricerca di nuovi spunti per imparare sempre qualcosa di nuovo. La rete offre

davvero tanto sull’argomento, ovviamente il vostro primo riferimento deve sempre

Vi consiglio, inoltre, di visitare spesso devAPP, la community italiana più grande sulla

-

nibili e ben preparate, disposte sempre a darvi una mano. Insomma, tenete devAPP

Quanto a me, se questo libro vi è piaciuto e lo trovate interessante diffondete la voce,

consigliatelo ai vostri amici.

-

  ).

 

Page 152: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 152/154

Page 154: Tutorial Pratici Per IOS SDK v2.0

7/21/2019 Tutorial Pratici Per IOS SDK v2.0

http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 154/154