• DevTutorial
  • Libro
  • Guide Mac
  • Giovedi Contest

DevTutorial #7 – AccessContact, accediamo ai dati dei contatti

The AuthorAndrea Busi The Time31 ottobre 2008 Comments4
separator

Con un po’ di ritardo rispetto all’edizione su iSpazio, vi propongo anche su The Bubi Devs un nuovo appuntamento dei DevTutorial. In questo tutorial vi insegneremo come interfacciarvi con l’applicazione nativa “Contatti”, come richiamarla da una nostra applicazione e come ricavare i dati di un contatto selezionato. Insomma, un utile strumento che potrebbe trovare ampio utilizzo in molte applicazioni!

1. Definiamo il nuovo progetto

Aprimo Xcode, selezioniamo “File -> New Project”. Nel menù che ci appare selezioniamo “View-based Application”, clicchiamo su “Choose…” e immettiamo come nome “AccessContact” e fate clic su “Save”. Abbiamo così creato il nostro nuovo progetto.

Apriamo il file “AccessContactViewController.h”, che è la classe della vista che ci viene fornita con questo template. Inseriamo il seguente codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
 
@interface AccessContactViewController : UIViewController {
	IBOutlet UILabel *labelNome;
	IBOutlet UILabel *labelCognome;
	IBOutlet UILabel *labelTel;
}
 
- (IBAction)getContatto;
 
@end

Avrete subito capito che abbiamo definito tre label e un’azione. Alle righe 2 e 3, però, abbiamo importato due librerie, che si riferiscono ad “AddressBook”, ovvero all’applicazione “Contatti”. Questo, però, non basta per poter utilizzare tutte le sue funzioni. Dobbiamo importare all’interno del nostro progetto anche il framework necessario.

Espandete la sezione “Targets” nel progetto, e cliccate con il tasto destro su “AccessContact”, selezionando poi “Get Info”. Si aprirà una nuova schermata, in cui dobbiamo andare nella se- zione “General”. Nell’angolo in basso a sinistra noteremo un bottone “+”, clicchiamo e si aprirà un elenco di tutti i framework disponibili:

Selezioniamo “AddressBook.framework” e “AddressBookUI.framework” e clicchiamo poi su “Add”. Avremo così aggiunto questi due framework al nostro progetto. Possiamo così chiudere

la schermata delle proprietà. Salviamo il file “AccessContactViewController.h” e facciamo doppio clic su

“AccessContactViewControlle.xib” per aprire Interface Builder.

2. Importiamo il framework necessario

Dobbiamo ora definire l’aspetto grafico della nostra applicazione. Inseriamo le label necessarie e un bottone, per ricreare un aspetto grafico come questo:

Le label con il testo “—” sono quelle che poi conterranno le informazioni sul contatto selezio- nato dall’utente. Dobbiamo ora collegare gli elementi definiti in precedenza con quelli che abbiamo appena inserito nella vista. Tramite il pannello dei documenti selezioniamo “File’s Owner”, e apriamo il “Connections Inspector”. Potremo vedere i componenti che abbiamo dichiarato:

Ora dobbiamo collegarli nella maniera corretta, ovviamente in base al nome con cui li abbiamo chiamati: “labelNome”, quindi, andrà collegata con la label a fianco di “Nome” e così via. L’azione “getContatto”, invece, sarà da collegare al bottone, scegliendo come sempre “Touch Up Inside” tra le azioni disponibili. Ecco il risultato finale dei collegamenti:

Possiamo salvare tutto e chiudere Interface Builder.

3. Scriviamo il codice necessario

Dobbiamo ora implementare i metodi necessari per far funzionare l’applicazione. Iniziamo con la definizione del metodo “getContatto”, ovvero l’azione collegata alla pressione del bottone. Apriamo il file “AccessContactViewController.m” e inseriamo il seguente codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#import "AccessContactViewController.h"
 
@implementation AccessContactViewController
 
-(IBAction)getContatto {
	//Crea il picker
	ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
	//Imposta il delegate del picker come vista principale
	picker.peoplePickerDelegate = self;
	//Visualizza il picker
	[self presentModalViewController:picker animated:YES];
	//Rilascio
	[picker release];
}

Come si può leggere dai commenti, questo metodo istanzia un oggetto chiamato “picker”, che ci permetterà di aprire l’applicazione nativa “Contatti”. Alla riga 9 definiamo il delegato di tale oggetto: impostando “self”, comunichiamo che sarà la stessa classe (ovvero “AccessContactViewController”) a definire gli altri metodi necessari, che definiremo tra poco. Alla riga 11, infine, inseriamo tale oggetto come vista principale della nostra applicazione: l’utente vedrà così comparire l’applicazione nativa “Contatti” all’interno della nostra applicazione “AccessContact”.

Dobbiamo ora implementare i metodi richiesti dal delegato. Ecco il codice da inserire:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
	//Settiamo il nome
    labelNome.text = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
	//Settiamo il cognome
    labelCognome.text = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
	//Settiamo il numero di telefono
	ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
	labelTel.text = (NSString*)ABMultiValueCopyValueAtIndex(multi, 0);
	//Rimuove il controller "Contatti"
    [self dismissModalViewControllerAnimated:YES];
    return NO;
}
 
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {
    // facciamo tornare il controller alla vista principale
	[self dismissModalViewControllerAnimated:YES];
}

Il primo metodo legge le informazioni del contatto selezionato, e le setta nelle apposite label. L’unico inconveniente è dato dalle righe 7 e 8, che si occupano della lettura del numero di telefono: viene letto il primo numero presente (in quanto potrebbero anche esserci più numeri). E se non vi fosse nessun numero associato al contatto? In tal caso l’applicazione crasha. Questo avviene perché non abbiamo effettuato nessun controllo, ma potete semplicemente risolvere questo problema tramite un opportuno ciclo if.

Il metodo che inizia alla riga 15, infine, si occupa di chiudere l’applicazione “Contatti” quando l’utente sceglie di uscire senza selezionare nessun contatto (ovvero quando clicca su “Cancel”). Potete notare che l’istruzione di tale metodo è uguale a quella presente alla riga 10, che è uguale a sua volta a quella presente alla riga 7 del primo metodo implementato.

Cliccate su “Build and Go!” e testate la vostra applicazione!

Se Avete Problemi, questo è il file di progetto.

La guida è stata tradotta in italiano e ampliata da Andrea Busi per “iSpazio” e “Bubi Devs“. Trovare la guida originale a questo indirizzo: “Access the Address Book: Iphone Noob”.  I meriti delle rispettive versioni, quindi, sono dei legittimi autori.

separator
Condividi su FriendFeed
separator
Comments
4 Comments
separator
  1. Claudio

    Ciao! Mi sto cimentando nei tutorial in quanto è da poco che ho iniziato a studiare lo sviluppo di applicazioni per iphone;
    dato che non conosco bene la sintassi volevo chiedere come andava scritto l’if per non far crashare l’app in assenza del numero.
    Grazie mille

    ReplicaReplica
  2. Claudio

    mi autorispondo ho risolto il problema ecco il codice:
    ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
    int controllo = ABMultiValueGetCount (multi);
    if (controllo == 0){
    labelTel.text = [[NSString alloc]initWithFormat:@”no number”];
    }

    else{
    labelTel.text = (NSString*)ABMultiValueCopyValueAtIndex(multi, 0);
    }

    Ho utilizzato il conteggio dei numeri memorizzandolo in una variabile intera e poi ho fatto il confronto

    ReplicaReplica
  3. Andrea Busi

    @Claudio: ottimo, grazie mille.. sarà sicuramente utile ai prossimi lettori ;-)

    ReplicaReplica
separator
A chi è piaciuto questo articolo?
  1. The Bubi Devs » DevDifferent #2 - Struttura del progetto e funzionamento di “make”
separator

Scrivi la tua!

© 2010 Bubi Devs. Powered by WordPress Designed by miniMAC
w3c Made in Mac