7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 1/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 2/154
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
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
#&"
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 6/154
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.”
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 8/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 10/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 11/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 13/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 14/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 16/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 17/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 18/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 19/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 20/154
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.
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 22/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 23/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 24/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 25/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 26/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 27/154
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:
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;}
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 30/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 31/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 32/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 33/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 34/154
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.
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 36/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 38/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 39/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 40/154
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
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.
-
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 44/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 45/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 46/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 47/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 48/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 49/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 50/154
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
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.
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 54/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 55/154
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.
-
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 58/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 59/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 60/154
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
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.
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 63/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 64/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 65/154
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];
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
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
-
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 70/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 71/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 72/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 73/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 74/154
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
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;}
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 78/154
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.
-
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>
-
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 81/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 82/154
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
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]]; }}
-
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 86/154
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:
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 88/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 89/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 90/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 91/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 92/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 93/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 94/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 95/154
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.
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
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);
}
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
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];}
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 101/154
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.
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 104/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 106/154
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
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;}
- -
-
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 110/154
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
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];}
- -
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
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];}
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 116/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 117/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 118/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 120/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 121/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 122/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 123/154
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;}
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 125/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 126/154
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
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];}
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 129/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 130/154130
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 131/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 132/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 133/154
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.
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
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;}
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 138/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 139/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 140/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 141/154
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
-
-
-
-
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
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.
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 146/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 147/154
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
-
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 149/154
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 150/154
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.
-
).
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 152/154
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
7/21/2019 Tutorial Pratici Per IOS SDK v2.0
http://slidepdf.com/reader/full/tutorial-pratici-per-ios-sdk-v20 154/154
Top Related