• 20 heures
  • {0} Facile|{1} Moyenne|{2} Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

J'ai tout compris !

Mis à jour le 21/06/2013

Les contrôles qui affichent des données (2/2)

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Dans le chapitre précédent, nous avons appris à travailler avec des contrôles liés à du texte et des images. Mais peut-être aimeriez-vous travailler sur d'autres contrôles. C'est justement ce que je vais vous montrer dans ce chapitre.

Nous allons voir comment afficher un contenu Web, une carte, ou encore demander son avis à l'utilisateur. Et, tout comme pour le chapitre précédent, n'hésitez pas à vous reporter à celui-ci lors de vos futurs développements d'applications afin d'avoir un cas concret sous les yeux.

Afficher du contenu Web

Le contrôle Web View (figure suivante) est utilisé pour intégrer du contenu Web dans une application.

L'icône du contrôle Web View

Pour afficher une page Web, vous appliquerez la méthode loadRequest à ce contrôle. Par exemple, pour afficher le moteur de recherche Google dans un contrôle Web View nommé wv, vous utiliserez l'instruction suivante :

[wv loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:@"http://www.google.fr"]]];

La syntaxe est un peu surprenante, je vous l'accorde, mais il « suffit » de dire que :

  • la méthode loadRequest s'applique sur un objet de type NSURLRequest ;

  • un objet NSURLRequest est obtenu en appliquant la méthode requestWithURL sur un objet de type NSURL ;

  • un objet NSURL est obtenu en appliquant la méthode URLWithString sur une chaîne de caractères contenant l'adresse URL désirée.

Ainsi, le message le plus interne ([NSURL URLWithString:@"http://www.google.fr"]) définit un objet de type NSURL et l'initialise avec l'URL de Google :

[NSURL URLWithString:@"http://www.google.fr"]

Cet objet est passé à la méthode requestWithURL qui est appliquée sur un objet NSURLRequest :

[NSURLRequest requestWithURL: objet NSURL];

Enfin, l'objet retourné est passé à la méthode loadRequest qui est appliquée à l'objet Web View wv :

[wv loadRequest: objet NSURLRequest];

Cette instruction se place dans le fichier d'en-têtes de votre application, comme ceci :

- (void)viewDidLoad
{
[super viewDidLoad];
[wv loadRequest:[NSURLRequest requestWithURL: [NSURL URLWithString:@"http://www.google.fr"]]];
}

Il ne vous reste alors plus qu'à lancer l'application : vous venez de créer un navigateur Web qui démarre automatiquement sur le moteur de recherche Google !

Afficher une carte

Le contrôle Map View (figure suivante) permet d'afficher une carte, comme dans l'application Maps.

L'icône du contrôle Map View

En utilisant les méthodes de la classe MKMapView, vous pouvez, entre autres, centrer la carte sur une coordonnée spécifique, choisir la taille de la zone à afficher ou encore ajouter des informations personnalisées sur la carte.

Dans cette section, je vais vous montrer comment afficher la carte centrée sur Paris. Le but du jeu est d'afficher quelque chose ressemblant à la figure suivante sur votre device.

Paris est centré sur la carte

Définissez un nouveau projet de type Single View Application et donnez-lui le nom « map ». Une fois n'est pas coutume, nous n'allons pas utiliser Interface Builder dans ce projet !

Ajout du framework MapKit à l'application

Pour pouvoir afficher une carte dans la fenêtre de votre application, vous devez ajouter le framework MapKit à l'application. Pour ce faire, rien de plus simple : lisez les instructions suivantes en vous aidant de la figure suivante.

  • Sélectionnez la première entrée dans le volet de navigation. Ici, l'entrée map (1).

  • Sélectionnez l'onglet Build Phases dans le volet droit (2).

  • Développez le dossier Link Binary with Libraries (3).

  • Cliquez sur + (4).

  • Ajoutez le framework désiré (5).

  • Validez en cliquant sur Add (6).

Pour afficher une carte dans une application, il lui faut le framework MapKit

Modification du fichier .h

Cliquez sur ViewController.h dans le volet de navigation et ajoutez une instruction #import pour accéder au framework MapKit :

#import <MapKit/MapKit.h>

Déclarez ensuite un objet de type MKMapView :

MKMapView *mapView;

Si vous avez suivi mes indications, le fichier mapViewController.h devrait maintenant avoir l'allure suivante :

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface ViewController : UIViewController
{
MKMapView *mapView;
}
@end

Modification du fichier .m

Cliquez sur ViewController.m dans le volet de navigation. Vous allez maintenant initialiser, personnaliser et afficher l'objet mapView. Ce traitement se fera dans la méthode viewDidLoad. Complétez cette méthode comme ceci :

- (void)viewDidLoad
{
[super viewDidLoad];
// Instancier la carte
mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
// Définir le zoom
MKCoordinateSpan span;
span.latitudeDelta=0.5;
span.longitudeDelta=0.5;
// Définir les coordonnées de Paris
CLLocationCoordinate2D parisCoordinates;
parisCoordinates.latitude=48.858391;
parisCoordinates.longitude=2.35279;
MKCoordinateRegion parisRegion;
parisRegion.span=span;
parisRegion.center=parisCoordinates;
// Centrer la carte sur Paris
[mapView setRegion:parisRegion animated:TRUE];
// Ajouter la carte à la vue
[self.view insertSubview:mapView atIndex:0];
}

Cela fait beaucoup d'instructions n'est-ce pas ?
Examinons-les calmement et vous verrez qu'il n'y a rien d'insurmontable…

L'instruction de la ligne 6 réserve l'espace nécessaire en mémoire pour loger l'objet MKMapView mapView. Il n'y a rien de sorcier là-dedans : c'est juste la syntaxe (un peu lourde je vous l'accorde !) à utiliser :

mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];

Le premier message réserve la mémoire pour un objet MKMapView ([MKMapView alloc]). Le deuxième message utilise la méthode initWithFrame pour définir les dimensions du rectangle dans lequel sera affichée la vue. Ici, self.view.bounds signifie la taille de la vue courante.

Le bloc d'instructions suivant définit la structure span de type MKCoordinateSpan :

MKCoordinateSpan span;

Par son intermédiaire, on définit le nombre de degrés en latitude (c'est-à-dire du nord au sud) et en longitude (c'est-à-dire de l'ouest à l'est) de la zone d'affichage :

span.latitudeDelta=0.5;
span.longitudeDelta=0.5;

À titre d'information :

  • 1 degré de latitude correspond environ à 111 kilomètres.

  • 1 degré de longitude correspond environ à 111 kilomètres à l'équateur et à 0 kilomètre aux pôles.

Le bloc d'instructions suivant définit les coordonnées de la ville de Paris. Pour cela, la structure parisCoordinates, de type CLLocationCoordinate2D est instanciée :

CLLocationCoordinate2D parisCoordinates;

Puis les coordonnées de la ville de Paris y sont stockées :

parisCoordinates.latitude=48.833;
parisCoordinates.longitude=2.333;

Le bloc d'instructions suivant définit le centre de l'affichage et le niveau de détail. Pour cela, la structure parisRegion de type MKCoordinateRegion est instanciée :

MKCoordinateRegion parisRegion;

Puis le niveau de détail est précisé en faisant référence à la structure map définie précédemment :

parisRegion.span=span;

Le centre de l'affichage est défini en faisant référence à la structure parisCoordinates définie précédemment :

parisRegion.center=parisCoordinates;

Il ne reste plus qu'à envoyer un message à l'objet mapView pour lui demander d'afficher la région définie dans la structure parisRegion définie précédemment. Ici, le paramètre animated étant initialisé à TRUE, l'affichage se fera avec une animation :

[mapView setRegion:parisRegion animated:TRUE];

Pour terminer, la vue mapView est ajoutée à l'application, ce qui provoque son affichage :

[self.view insertSubview:mapView atIndex:0];

Et comme vous avez été sages, je vous donne les codes de l'application. :-)

ViewController.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface ViewController : UIViewController
{
MKMapView *mapView;
}
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// instancier la carte
mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
//définir le zoom
MKCoordinateSpan span;
span.latitudeDelta=0.5;
span.longitudeDelta=0.5;
//définir les coordonnées de Paris
CLLocationCoordinate2D parisCoordinates;
parisCoordinates.latitude=48.858391;
parisCoordinates.longitude=2.35279;
MKCoordinateRegion parisRegion;
parisRegion.span=span;
parisRegion.center=parisCoordinates;
// centrer la carte sur Paris
[mapView setRegion:parisRegion animated:TRUE];
// ajouter la carte à la vue
[self.view insertSubview:mapView atIndex:0];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

Quand le contenu dépasse la taille du contrôle, de la vue ou de la fenêtre

Vous utiliserez un contrôle Scroll View (figure suivante) pour afficher un contenu qui est plus grand que la fenêtre de l'application. Les utilisateurs pourront alors faire glisser la fenêtre de visualisation sur le contenu, mais aussi zoomer vers l'avant et vers l'arrière en pinçant/étirant l'écran avec deux doigts.

L'icône du contrôle Scroll View

Pour illustrer le fonctionnement de ce contrôle, nous allons y insérer un contrôle Image View de taille supérieure à celle du Scroll View. L'utilisateur pourra alors se déplacer dans l'image en utilisant des gestuelles de glisser.

Définissez un projet de type Single View Application et donnez-lui le nom « usv ».
Dans le volet de navigation, cliquez sur MainStoryboard.storyboard, puis ajoutez un contrôle Scroll View au canevas de l'application.

Cliquez sur l'icône Show the Assistant editor dans la barre d'outils de Xcode, contrôle-glissez-déposez le contrôle Scroll View du canevas sur le fichier d'en-têtes, juste au-dessus de l'instruction @end et définissez l'outlet scrollView.

Le fichier d'en-têtes doit maintenant avoir l'allure suivante :

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

Comme à la figure suivante, vous allez maintenant superposer une image au contrôle Scroll View :

  • déposez un contrôle Image View sur le contrôle Scroll View (1) ;

  • choisissez une image de grande taille et insérez-la dans les ressources de l'application (2) ;

  • affectez-la au contrôle Image View en agissant sur sa propriété Image (3) ;

  • visualisez la partie supérieure gauche de l'image en choisissant Top Left dans la liste déroulante Mode (4).

On prépare notre application avec une image de grande taille

Sélectionnez le fichier ViewController.m dans le volet de navigation et complétez la méthode viewDidLoad comme suit :

- (void)viewDidLoad
{
[super viewDidLoad];
[scrollView setScrollEnabled:YES];
[scrollView setContentSize:CGSizeMake(819,1024)];
}

Le premier message destiné à l'objet scrollView autorise les scrollings :

[scrollView setScrollEnabled:YES];

Le deuxième définit la taille du scrolling. Ici, elle a été arbitrairement fixée à 819x1024 pixels :

[scrollView setContentSize:CGSizeMake(819,1024)];

Pour que la zone d'affichage du contrôle Scroll View s'adapte exactement à celle de l'image, vous pouvez utiliser l'instruction suivante :

[scrollView setContentSize:CGSizeMake(imageView.image.size.width, imageView.image.size.height)];

Voici le code complet, que vous pouvez télécharger grâce à un code web.

ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize scrollView;
@synthesize imageView;
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
[scrollView setScrollEnabled:YES];
//[scrollView setContentSize:CGSizeMake(819,1024)];
[scrollView setContentSize:CGSizeMake(imageView.image.size.width, imageView.image.size.height)];
}
- (void)viewDidUnload
{
[self setScrollView:nil];
[self setImageView:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

Demander son avis à l'utilisateur

Il est parfois utile d'afficher une boîte de dialogue modale (c'est-à-dire qui se superpose à la fenêtre de l'application et qui y interdit toute action) pour demander à l'utilisateur de prendre une décision. Par exemple, pour confirmer l'arrêt de l'application ou l'écrasement d'un fichier. Deux classes peuvent être utilisées à cet effet : UIAlertView et UIActionSheet.

Une boîte de dialogue modale avec un contrôle UIAlertView

Définissez un projet basé sur le modèle Single View Application et donnez-lui le nom « alerte ».
Dans le volet de navigation, cliquez sur MainStoryboard.storyboard et ajoutez un contrôle Label à la vue. Double-cliquez dans le Label et tapez « Cliquez sur un bouton ».
Définissez un outlet pour le Label et donnez-lui le nom status.

Vous allez maintenant ajouter quelques lignes de code dans la méthode viewDidLoad pour provoquer l'affichage de la boîte de dialogue modale.
Cliquez sur ViewController.m dans le volet de navigation et complétez la méthode viewDidLoad comme suit :

- (void)viewDidLoad
{
[super viewDidLoad];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Voulez-vous arrêter ?"
message:@"Confirmez que vous voulez quitter l'application" delegate:self
cancelButtonTitle:@"Annuler" otherButtonTitles:nil];
[alert addButtonWithTitle:@"Confirmer"];
[alert show];
}

Les lignes 4 à 7 définissent l'objet alert de type UIAlertView.

Cet objet est initialisé avec :

  • un titre : initWithTitle:@"Voulez-vous arrêter ?" ;

  • un message : message:@"Confirmez que vous voulez quitter l'application" ;

  • un bouton Annuler : cancelButtonTitle:@"Annuler".

Les événements qui lui sont liés sont traités dans la classe alertViewController elle-même (delegate:self).

L'instruction suivante ajoute le bouton Confirmer à la boîte de dialogue :

[alert addButtonWithTitle:@"Confirmer"];

Enfin, la dernière instruction affiche la boîte de dialogue :

[alert show];

Vous pouvez lancer l'application et voir qu'elle fonctionne à la perfection (figure suivante), si ce n'est que les boutons ne produisent aucun effet.

Notre application se lance… mais les boutons ne produisent aucun effet

Nous allons régler ce problème en définissant une méthode action. Ajoutez le code suivant au fichier alertViewController.m :

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0)
status.text = @"Vous avez cliqué sur Annuler";
else
status.text = @"Vous avez cliqué sur Confirmer";
}

La méthode alertView:didDismissWithButtonIndex est exécutée lorsque l'utilisateur clique sur un des boutons de la boîte de dialogue modale. L'entier buttonIndex représente l'index du bouton cliqué. Il vaut :

  • 0 si le bouton Annuler a été cliqué ;

  • 1 si le bouton Confirmer a été cliqué.

En fonction du bouton cliqué, un message ou un autre est affiché dans le contrôle Label.

Voici le code de l'application.

ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *status;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize status;
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Voulez-vous arrêter ?"
message:@"Confirmez que vous voulez quitter l'application" delegate:self
cancelButtonTitle:@"Annuler" otherButtonTitles:nil];
[alert addButtonWithTitle:@"Confirmer"];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0)
status.text = @"Vous avez cliqué sur Annuler";
else
status.text = @"Vous avez cliqué sur Confirmer";
}
- (void)viewDidUnload
{
[self setStatus:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

Une boîte de dialogue modale avec un contrôle UIActionSheet

Une variante du contrôle UIAlertView consiste à utiliser le contrôle UIActionSheet. Ce dernier affiche une vue modale qui se superpose à la vue actuelle dans la partie inférieure de la fenêtre.

Définissez un projet basé sur le modèle Single View Application et donnez-lui le nom « actionSheet ».
Dans le volet de navigation, cliquez sur MainStoryboard.storyboard et ajoutez un contrôle Label à la vue. Double-cliquez sur le Label et tapez « Appuyez sur un bouton ».
Enfin, définissez un outlet pour ce Label et donnez-lui le nom status.

Vous allez maintenant ajouter quelques lignes de code dans la méthode viewDidLoad pour provoquer l'affichage de la vue modale.
Cliquez sur ViewController.m dans le volet de navigation, et complétez la méthode viewDidLoad comme suit :

- (void)viewDidLoad
{
[super viewDidLoad];
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Voulez-vous arrêter l'application ?"
delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil
otherButtonTitles:@"Oui", @"Non",@"Je ne sais pas", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
actionSheet.destructiveButtonIndex = 1;
[actionSheet showInView:self.view];
}

La première instruction définit l'objet actionSheet de type UIActionSheet.

Cet objet est initialisé avec :

  • un titre : initWithTitle:@"Voulez-vous arrêter l'application ?" ;

  • trois boutons : otherButtonTitles:@"Oui", @"Non",@"Je ne sais pas", nil).

Le traitement du contrôle se fait dans la classe actionSheetViewController elle-même : delegate:self.

L'instruction suivante définit le style du contrôle :

actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;

Les valeurs possibles pour la propriété actionSheetStyle sont les suivantes (N'hésitez pas à les tester !) :

  • UIActionSheetStyleAutomatic ;

  • UIActionSheetStyleDefault ;

  • UIActionSheetStyleBlackTranslucent ;

  • UIActionSheetStyleBlackOpaque.

L'instruction suivante indique que le bouton d'index 1 (le deuxième en d'autres termes) doit être différencié des autres, car il présente un caractère particulier. Ce bouton apparaît en rouge.

actionSheet.destructiveButtonIndex = 1;

L'instruction suivante ajoute la vue modale dans la vue courante :

[actionSheet showInView:self.view];

Lancez l'application dans le simulateur. Vous devriez obtenir quelque chose ressemblant à la figure suivante.

L'application lancée dans le simulateur

L'application fonctionne, mais un triangle de couleur jaune apparaît dans le code, comme à la figure suivante

Xcode affiche un triangle de couleur jaune

Observez d'un peu plus près le message d'erreur. Xcode nous indique que la classe ViewController n'implémente pas le protocole UIActionSheetDelegate et ne peut donc pas répondre aux événements générés par l'objet actionSheet. Qu'à cela ne tienne : cliquez sur ViewController.h dans le volet de navigation et ajoutez le protocole demandé dans la déclaration de l'interface :

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIActionSheetDelegate>
@property (weak, nonatomic) IBOutlet UILabel *status;
@end

Le problème a disparu, comme par magie.

Maintenant, il ne reste plus qu'à définir le code qui réagit aux clics sur les boutons de la boîte de dialogue modale. Cliquez sur ViewController.m dans le volet de navigation et ajoutez la méthode actionSheet:clickedButtonAtIndex dans le code :

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
status.text = @"Vous avez cliqué sur Oui";
if (buttonIndex == 1)
status.text = @"Vous avez cliqué sur Non";
if (buttonIndex == 2)
status.text = @"Vous avez cliqué sur Je ne sais pas";
}

Cette méthode est appelée lorsqu'un bouton de la boîte de dialogue modale est pressé. Le NSInteger buttonIndex représente l'index du bouton pressé par l'utilisateur (0 si le premier bouton est pressé, 1 si le deuxième bouton est pressé, etc.).

La méthode clickedButtonAtIndex se contente d'afficher un texte en rapport avec le bouton cliqué dans le contrôle Label.

Vous trouverez à la suite le code de l'application.

ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIActionSheetDelegate>
@property (weak, nonatomic) IBOutlet UILabel *status;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize status;
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Voulez-vous arrêter l'application ?"
delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil
otherButtonTitles:@"Oui", @"Non",@"Je ne sais pas", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
actionSheet.destructiveButtonIndex = 1;
[actionSheet showInView:self.view];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
status.text = @"Vous avez cliqué sur Oui";
if (buttonIndex == 1)
status.text = @"Vous avez cliqué sur Non";
if (buttonIndex == 2)
status.text = @"Vous avez cliqué sur Je ne sais pas";
}
- (void)viewDidUnload
{
[self setStatus:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end

En résumé

  • Le contrôle Map View permet d'afficher une carte, comme dans l'application Maps d'Apple. En utilisant les méthodes de la classe MKMapView, vous pouvez, entre autres, centrer la carte sur une coordonnée spécifique, choisir la taille de la zone à afficher ou encore ajouter des informations personnalisées sur la carte.

  • Vous utiliserez un contrôle Scroll View pour afficher un contenu qui est plus grand que la fenêtre de l'application. Les utilisateurs pourront alors faire glisser la fenêtre de visualisation sur le contenu, mais aussi zoomer vers l'avant et vers l'arrière en pinçant/étirant l'écran avec deux doigts.

  • Il est parfois utile d'afficher une boîte de dialogue modale (c'est-à-dire qui se superpose à la fenêtre de l'application et qui y interdit toute action) pour demander à l'utilisateur de prendre une décision. Par exemple, pour confirmer l'arrêt de l'application ou l'écrasement d'un fichier. Deux classes peuvent être utilisées à cet effet : UIAlertView et UIActionSheet.

Exemple de certificat de réussite
Exemple de certificat de réussite