tutorial pratici per ios sdk v2.0
DESCRIPTION
tutorial per sdk iosTRANSCRIPT
![Page 1: Tutorial Pratici Per IOS SDK v2.0](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/43.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/44.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/48.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/49.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/50.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/51.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/52.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/53.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/54.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/55.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/56.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/57.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/58.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/59.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/60.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/61.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/62.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/63.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/64.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/65.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/66.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/67.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/68.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/69.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/70.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/71.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/72.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/73.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/74.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/75.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/76.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/77.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/78.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/79.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/80.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/81.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/82.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/83.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/84.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/85.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/86.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/87.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/88.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/89.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/90.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/91.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/92.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/93.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/94.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/95.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/96.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/97.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/98.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/99.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/100.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/101.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/102.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/103.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/104.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/105.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/106.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/107.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/108.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/109.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/110.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/111.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/112.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/113.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/114.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/115.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/116.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/117.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/118.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/119.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/120.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/121.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/122.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/123.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/124.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/125.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/126.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/127.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/128.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/129.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/130.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/131.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/132.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/133.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/134.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/135.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/136.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/137.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/138.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/139.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/140.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/141.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/142.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/143.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/144.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/145.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/146.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/147.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/148.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/149.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/150.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/151.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/152.jpg)
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 152/154
![Page 153: Tutorial Pratici Per IOS SDK v2.0](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/153.jpg)
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 153/154153
B I B L I O G R A F I A
I miei tutorial spesso sono nati prendendo spunto da altre guide trovate su Internet,
)*+,-./. '
)*+,-./. "
)*+,-./. (
)*+,-./. #1
![Page 154: Tutorial Pratici Per IOS SDK v2.0](https://reader036.vdocuments.net/reader036/viewer/2022062411/563db8b9550346aa9a9658ea/html5/thumbnails/154.jpg)
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 154/154