Skip to content

17 février 2011 | Rédigé par Mathieu

33

Liste et détails : créer une application multivues (2/3) [Tutoriel iPhone n°9]

Ce tutoriel est la suite du tutoriel iPhone n°8. Il reprend là où nous avions laissé le travail précédemment : nous avons fait une liste d’éléments issus d’un fichier .plist et, en touchant un élément de la liste, nous avions accès à une fenêtre de détails. Il s’agit ici d’apporter des modifications à la liste et plus précisément d’ajouter des éléments : l’occasion ici de découvrir les fenêtres modales sur iOS.

Préambule : NSArray et NSMutableArray

Avant de commencer à ajouter nos fonctionnalités, il est nécessaire de s’arrêter sur un point concernant les objets proposés par UIKit. Pour stocker notre liste de sites Internet, nous avons utilisé un objet de type NSArray :

@property (nonatomic, retain) NSArray *tabWebSites;

Il s’agit d’un tableau d’objets qui permet toutes sortes d’actions comme « compter le nombre d’éléments », « récupérer un élément du tableau », etc. NSArray a une limitation, et elle est de taille : il ne peut pas être modifié. Du coup cela va nous poser problème dans ce tutoriel : si je souhaite ajouter ou supprimer des éléments, il va bien falloir que je modifie mon tableau de sites.

Pour implémenter un tableau que l’on peut modifier de la sorte, on utile la classe NSMutableArray. Cette classe propose les mêmes méthodes que NSArray qu’elle surcharge et fonctionne donc de manière identique. Elle propose, en outre plusieurs méthodes nouvelles :

insertObject:atIndex:
removeObjectAtIndex:
addObject:
removeLastObject
replaceObjectAtIndex:withObject:

Alors pourquoi avoir utilisé NSArray dans le tutoriel n°8 ? Il faut évidemment considérer les performances et l’impact mémoire dans le choix de vos objets dans UIKit. NSArray est bien plus économe que NSMutableArray et, quand on développe pour iPhone (comme pour tout développement embarqué), cette question est fondamentale.

Voici donc un petit exercice nécessaire avant de continuer : transformer le tableau NSArray *tabWebSites en NSMutableArray. Il s’agit de faire les modifications dans le RootViewController (.m et .h). Faîtes cette modification (il y a plusieurs endroits à modifier) et recompilez votre application pour vérifier que tout fonctionne encore avant de passer à la suite !

Ajouter le bouton sur la vue pour ajouter un site

Nous souhaitons proposer aux utilisateurs d’ajouter le ou les sites de leur choix à la liste. Nous allons donc ajouter, dans la barre de navigation un bouton « Ajouter » qui permettra d’ouvrir un dialogue d’ajout.

Dans XCode, nous allons ajouter un IBOutlet appelé « addButtonItem » qui représentera le bouton, et une IBAction qui sera appelée quand l’utilisateur appuiera sur ce bouton. Dans RootViewController.h, nous ajoutons donc ces deux éléments :

@interface RootViewController : UITableViewController {
	NSMutableArray *websites;
	IBOutlet UIBarButtonItem *addButtonItem;
}
 
@property (nonatomic, retain) NSMutableArray *tabWebSites;
@property (nonatomic, retain) UIBarButtonItem *addButtonItem;
 
- (IBAction) addButtonPressed: (id) sender;

Dans le fichier RootViewController.m, ajouter le @synthetise et n’oubliez pas le « release » dans la méthode « dealloc ». Vous devez implémenter la méthode addButtonPressed. Ne mettons qu’un simple log pour le moment :

- (IBAction) addButtonPressed: (id) sender {
	NSLog(@"On ajoute !");
}

Maintenant il s’agit de créer effectivement l’objet. Pour ce faire, nous pouvons le faire dans le code (via XCode) ou beaucoup plus simplement à l’aide d’InterfaceBuilder. Voyons comment mettre en place cette deuxième méthode.

Ouvrez le fichier RootViewController.xib, et faîtes apparaître la fenêtre « Library ». Faîtes glisser un élément « Bar Button Item » dans la fenêtre principale.

Ajouter un UIBar Button Item

Ouvrez la fenêtre d’inspecteur et modifiez le champ « Identifier » de bouton pour « Add » (c’est le bouton avec le « + »). Profitez en pour vous familiariser avec les différents types de boutons proposés. Vous reconnaîtrez ceux que vous avez l’habitude de voir sur la plupart des applications iPhone (Bookmarks, Search, Camera…).

Changer le type du UIButtonItem

Enfin, il s’agit de relier l’IBOutlet et l’IBAction que nous avons créés précédemment avec ce nouvel élément. Cliquez-droit sur « File’s owner » (dans notre cas, il s’agit d’un RootViewController) et faîtes glisser le IBOutlet « addButtonItem » vers le bouton nouvellement créé. Pour l’action, c’est presque pareil, cliquez droit sur le bouton dans la liste et faîtes glisser « selector » vers File’s Owner. Choisissez notre méthode addButtonPressed.

Relier l'action

Sauvegardez et revenez à XCode.

Il reste une dernière formalité et pas des moindres. Il faut présenter ce nouveau bouton. Il nous faut l’ajouter dans la barre de navigation, dans la partie de gauche. Pour ce faire, rendez-vous dans la méthode viewDidLoad pour ajouter la ligne suivante :

self.navigationItem.leftBarButtonItem = self.addButtonItem;

Sauvegardez et compilez. Le bouton apparaît alors dans la barre de navigation supérieure. Quand vous cliquez dessus, la ligne de log est imprimée. Parfait !

Créer la vue qui permettra de saisir les informations du nouveau site

Si vous avez suivi la première partie de ce tutoriel, il n’y a rien, ici, de bien nouveau. Je vais donc passer rapidement là dessus en vous précisant les points essentiels :

  • Dans XCode, créez une nouvelle classe, héritée de UIViewController, appelez-la ModifViewController et n’oubliez pas d’associer un fichier .h et un fichier .xib
  • Ajoutez trois attributs et autant de propriétés dans le fichier .h
#import 
 
@interface ModifViewController : UIViewController {
	IBOutlet UITextField *titleTextField;
	IBOutlet UITextField *descriptionTextField;
	IBOutlet UITextField *urlTextField;
}
 
@property (nonatomic,retain) UITextField *titleTextField;
@property (nonatomic,retain) UITextField *descriptionTextField;
@property (nonatomic,retain) UITextField *urlTextField;
 
@end
  • Synthétisez les dans le .m et n’oubliez pas les release dans la méthode dealloc
  • Dans InterfaceBuilder, Ajoutez trois zones de textes et des labels pour obtenir le rendu suivant (on laisse de la place pour le clavier qui va apparaître par la suite) :

  • Attachez les outlets avec les éléments que vous venez de déposer dans la vue.
  • Revenez à XCode, compilez pour voir si tout va bien (inutile de tester : on a pas appelé la vue).

Appeler la vue quand on appuie sur le bouton « + »

Vous avez un bouton « + », vous avez une vue à appeler : il ne reste qu’à lier les deux ! Pour afficher des formulaires d’ajout et de modification, il convient d’utiliser une autre métaphore que celle employée pour la navigation (qui enchaîne les écrans en poussant l’ancien écran vers la gauche quand le nouveau arrive par la droite). Il s’agit des « Modal View« . Un exemple, sur votre iPhone, allez dans l’application « Téléphone » ou contacts et appuyez sur le « + » pour ajouter un contact. L’écran d’ajout arrive par le bas pour se superposer sur l’écran actuel. L’utilisateur sait que l’écran précédent est derrière cette nouvelle vue et s’attend à la retrouver une fois qu’il aura appuyé sur un bouton OK (ou Annuler, le cas échéant).

En terme de code, c’est sensiblement la même chose que la navigation dans un UINavigationController : on crée la vue, on la pousse, et on release. La seule différence, c’est que c’est la vue actuelle qui « supporte » la fenêtre modale, et non un UINavigationController. Rendez-vous dans méthode addButtonPressed et modifiez la comme suit :

- (IBAction) addButtonPressed: (id) sender {
	ModifViewController *addView = [[ModifViewController alloc] initWithNibName:@"ModifViewController" bundle:nil];
	[self presentModalViewController:addView animated:YES];
	[addView release];
}

Compilez, testez… La fenêtre modale apparaît comme demandée… et… GAME OVER : vous ne pouvez plus faire autre chose que quitter l’application : aucun élément ne permet de revenir.

Euh chef ?! On fait quoi maintenant ?

Super on affiche notre vue pour ajouter, mais on ne peut pas en partir sans devoir quitter l’application. Il nous faut ajouter deux boutons « Annuler » et « OK » et enregistrer le nouveau site. Généralement, ces boutons sont dans la partie supérieure de l’écran, dans une barre qui fait curieusement penser à la barre bleue qu’on a fait apparaître avec les UINavigationController. Commençons donc par mettre ce navigationController autour de notre vue :

- (IBAction) addButtonPressed: (id) sender {
	ModifViewController *addView = [[ModifViewController alloc] initWithNibName:@"ModifViewController" bundle:nil];
	UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:addView];
	[self presentModalViewController:navc animated:YES];
	[addView release];
	[navc release];
}

Ajoutons deux boutons : un « Enregistrer » et un « Annuler ». Pour cela, on procède un peu de la même façon que pour notre bouton « + » précédent. Ouvrez ModifViewController.m et modifiez la méthode ViewDidLoad comme suit :

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc]
		initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
		target:self
		action:@selector(cancel:)]
	autorelease];
}

Dans ce code, on ajoute donc nos deux boutons qu’on associe avec des méthodes (@selector) : le bouton « Annuler » est associé à la méthode « cancel: » et le bouton « Enregistrer » est associé à « save ».

Commençons par implémenter la méthode « cancel ». Cette méthode doit masquer la vue pour revenir à l’écran précédent. Dans ModifViewController.h, ajoutez la déclaration de la méthode :

- (IBAction) cancel: (id) sender;

Et implémentez-la dans ModifViewController.m :

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

Vous pouvez compiler et tester. Cette fois, ouf ! nous ne sommes plus bloqués. Par contre, il est temps de se concentrer sur la sauvegarde.

Procéder à l’enregistrement du nouveau site

Petite exercice pour commencer. Ajoutez un bouton UIBarButtonSystemItemSave dans la partie droite (rightBarButtonItem) qui appelle une nouvelle méthode appelée save:. Pour le moment, dans cette méthode, fermez simplement la fenêtre modale. Si vous séchez, jetez juste un oeil un peu plus haut, nous venons de le faire.

Il s’agit maintenant de sauvegarder notre nouveau site dans notre liste de sites.

Avant de commencer, il nous faut faire un import de la classe WebSite pour qu’on puisse créer un objet de ce type. En haut du fichier ModifViewController.m, ajoutez la ligne :

#import "Website.h"

Puis nous allons créer un nouvel objet Website avec les valeurs du formulaire. Nous faisons ça au moment de sauvegarder : dans notre nouvelle méthode save:

- (IBAction) save: (id) sender {
	// Récupérer un NSUrl à partir de la valeur du champ texte
	NSURL *urlSite = [[NSURL alloc] initWithString:urlTextField.text];
 
	// Créer un nouveau site et affecter les valeurs
	Website *newSite = [[Website alloc] init];
	newSite.webSiteTitle = titleTextField.text;
	newSite.webSiteURL = urlSite;
	newSite.webSiteDescription = descriptionTextField.text;
 
	// Ne pas oublier de libérer le NSUrl qu'on vient de créer
	[urlSite release];
 
	[self dismissModalViewControllerAnimated:YES];
}

Il s’agit maintenant de rajouter notre nouveau site dans la liste des sites, mais comment ? La classe  ModifViewController ne connaît pas le tableau des sites qui est stocké dans RootViewController ! Qu’à cela ne tienne, nous allons passer ce tableau à notre classe ModifViewController qui pourra ainsi l’enrichir.

Dans ModifViewController.h ajoutez un NSMutableArray *tabWebSites :

NSMutableArray *tabWebSites;

Ajoutez la propriété pour y accéder :

@property (nonatomic, retain) NSMutableArray *tabWebSites;

Synthétisez la propriété dans ModifViewController.m et n’oubliez pas le release.

Dans la méthode addButtonPressed: de RootViewController.m, nous allons affecter notre tableau tabWebSites, comme ceci :

- (IBAction) addButtonPressed: (id) sender {
	ModifViewController *addView = [[ModifViewController alloc] initWithNibName:@"ModifViewController" bundle:nil];
 
	// On passe le tableau de sites pour que la nouvelle vue puisse le modifier
	addView.tabWebSites = self.tabWebSites;
 
	UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:addView];
	[self presentModalViewController:navc animated:YES];
	[addView release];
	[navc release];
}

Enfin, il est maintenant temps d’ajouter notre site dans notre tableau. Retournons à la méthode save: et ajoutons les deux lignes suivantes :

	/*   ...*/	
 
	// Ajouter le site web
	[tabWebSites addObject:newSite];
	[newSite release];
 
	[self dismissModalViewControllerAnimated:YES];
}

Compilez, testez… Et… Ca ne plante pas, mais pas de nouveau site à l’horizon. :-(

Le site n’apparaît pas dans la liste, alors que je viens de l’ajouter

Il reste en effet une dernière petite chose à faire pour voir apparaître les fuits de votre labeur. Et c’est assez simple vous allez voir. Dans le paragraphe précédent, nous avons ajouté un objet dans notre tableau webSites, puis nous avons masqué la vue modal. Jamais nous n’avons averti la UITableView que son contenu avait changé. C’est pourtant une étape nécessaire : iOS ne va pas passer son temps à vérifier que quelque chose à été modifié, au risque de transformer votre iPhone en brouette. Nous allons ajouter une petite ligne de code dans la méthode viewWillAppear, qui, comme son nom l’indique, est appelée au moment où la vue va être affichée : quand elle est affichée suite au passage dans un UINavigationController, par exemple, ou quand une fenêtre modale s’efface pour laisser réapparaître la vue.

Dans le code proposé par XCode à la création du projet, la méthode viewWillAppear est déjà codée, mais mise en commentaires. Enlevez les commentaires et modifiez la comme suit :

- (void)viewWillAppear:(BOOL)animated {
	[super viewWillAppear:animated];
	[self.tableView reloadData];
}

Cette fois c’est la bonne. Compilez et essayez d’ajouter un site : il vient s’ajouter en bas de la liste et on peut en voir un aperçu en touchant la ligne correspondante dans la liste.

C’est ainsi que s’achève cette seconde partie. La troisième et dernière partie arrive très vite. Nous verrons ensemble comment, très facilement, mettre en place le « Balayer pour supprimer« , et surtout comment faire en sorte de sauvegarder vos nouveaux sites ou les modifications dans la mémoire de l’iPhone (parce pour le moment, si vous quittez, et bien vous avez tout perdu). Donc à très vite pour la suite ;-)

Encore un peu de lecture :

33 Commentaires Poster un commentaire
  1. Olivier
    5 mar 2011

    Salut, je voudrais t’abord te remercier pour ces merveilleux tutoriels que tu fais, il m’aide enormement. Ensuite j’ai un probleme concernant la fin du tuto, Xcode me dit qu’il y a une erreur « request for member ‘websites’ in something not a structure or union » sur la ligne  » addView.websites = self.websites », j’ai essayé de trouver l’erreur mais y a pas moyen je ne la trouve pas.
    Donc si tu pouvais me dire ou je me suis planté sa m’aiderais beaucoup, merci

  2. 6 mar 2011

    @Olivier :
    Cette erreur signifie que la propriété « websites » n’est pas disponible dans ta addView ou dans ton objet RootViewController (ce qui est peu probable, vu que tu as déjà du faire la partie avant). Vérifie donc bien tes propriétés, c’est peut-être une erreur de frappe. Si ça ne marche toujours pas, donne moi plus d’éléments ! A+

  3. Olivier
    7 mar 2011

    J’ai cherché et verifié si je n’avais pas fais d’erreur de frappe mais je n’en ai pas trouver. Donc voici le lien de mon projet :
    http://cid-13d968a99cfadae6.office.live.com/self.aspx/Documents/MyWebSites.zip
    Comme sa tu auras toutes les elements à ta disposition.

  4. Sami
    7 mar 2011

    Bonjour

    j’ai la même erreur, est ce que vous êtes arrivés à trouver d’ou vient le problème?

    Merci

  5. Ded
    8 mar 2011

    @Olivier

    Je viens de regarder ton code. Tu as fais une erreur.
    addView.websites = self.websites => plante parce que ta propriété s’appelle « tabWebSites » (cf. déclaration dans le .h)

    Pour corriger l’erreur :
    addView.websites = self.tabWebSites

    Voilà :)

  6. Ded
    8 mar 2011

    Sinon merci beaucoup pour ces bons tutos ! Félicitations. A quand la suite ?!!

  7. Olivier
    10 mar 2011

    C’est bon, j’ai trouvé le probleme. Enfaite quand tu explique qu’il faut remplacer NSArray par NSMutableArray, tu ne dis pas que tu renomme tabWebSites en websites du coup j’avais une erreur.
    Probleme resolu.
    J’attend la suite avec impatience et espere qu’elle arrivera bientot.

  8. laurent
    11 mar 2011

    j’ai un problème sur ce programme

    [websites addObject:newSite];

    thread 1: program received signal « SIGABRT »

    je ne s’ai pas quoi faire
    merci

  9. laurent
    11 mar 2011

    sa fait cette erreur quand je veut sauvegarder le nouveau site

  10. 14 mar 2011

    Hello !
    Olivier, bien joué ! C’est corrigé dans le tuto et, promis, je finis la troisième et dernière partie très vite !
    Merci !

  11. Shon
    1 avr 2011

    Merci pour ce tuto ! Marche impeccable !
    Je viens de le faire sous Xcode 4 après avoir suivi le tuto vidéo de ich’ = Aucun soucis particulier ….

    Juste penser que si vous avez suivi le tuto de ich’ à la lettre, il ne sert a rien de faire :

    « NSURL *urlSite = [[NSURL alloc] initWithString:urlTextField.text]; »
    puis « newSite.webSiteURL = urlSite; »

    faites juste « newSite.webSiteUrl = urlTextField.text; » vu que ich’ n’utilise que des NSString pour les détails des sites.

    Encore merci à ich’ et Mathieu et vivement la suite !

  12. boussetta
    18 avr 2011

    svp je veut savoir comment échangé les dnnées entre views

  13. JaG
    3 mai 2011

    Bonjour et merci pour ces très bon tuto.
    A quand la dernière partie? ;)

  14. Funewik
    8 mai 2011

    Oui, à quand la dernière partie ?
    Très beau boulot, merci !

  15. Zhelico
    19 mai 2011

    Excellent(s) tuto(s) !!! Vraiment impatient de finir mon appli avec la 3eme partie du tuto !! Merci encore

  16. Bastien
    20 mai 2011

    Bonjour à tous.

    Tout d’abord merci pour ces tutos.

    J’ai un petit problème sur celui-ci au moment de l’ajout du site dans ma liste.

    lorsque j’ajoute ces lignes dans ma fonction addButtonPressed :

    [tabWebSites addObject:new];
    [new release];

    la compilation se passe sans problème mais quand je presse le bouton save mon appli crash… je ne trouve pas le problème je ne comprend pas d’ou cela peut venir.

    est-ce que quelqu’un peut m’aider?

  17. Bastien
    20 mai 2011

    erratum je ne les ai pas mis dans la fonction addButtonPressed mais dans save;)

  18. Anthony
    22 juin 2011

    Pas mal vos tutos, à quand la suite ? :P
    Sa fait un moment que je l’attends :D

  19. Arthur
    7 juil 2011

    Salut a tous,

    Tout d’abord merci pour le travail que vous avez fourni pour ces tutos, ils sont vraiment super clair et correspondent exactement a ce que je recherchais!

    J’ai cependant un soucis avec la dernière partie, xcode semble ne pas bien apprécier la mine:

    addview.tabWebSites = self.tabWebSites;

    En effet, tout plante que je liquéfie sur le bouton add, alors que tout vas bien si je supprime cette ligne.
    J’ai relu mon code 15 fois, je ne vois vraiment pas ou est l’erreur, j’ai pourtant vérifié toutes mes variables…
    Je voudrais bien pouvoir vous éclairer un peu plus mais lorsque je debug, le programme ne plante jamais aux meme endroits (parfois au clic sur le bouton add, parfois sur le cancel et parfois sur le save…) c’est a n’y rien comprendre…!

    J’espère que quelqu’un pourra m’aider, en tout cas je vous remercie d’avance!

    Arthur

  20. Cyril
    20 juil 2011

    Bonjour,
    Tout d’abord merci pour ces tutus vraiment très utiles.

    J’ai un petit problème avec xCode. Actuellement, toutes les applications qui utilise un clavier (comme celle ci) plantent.

    Dès que je tape sur 3,4 touches l’appli se ferme.

    C’est peut-être à cause de la beta ?

  21. Rymn
    21 juil 2011

    Dans le même genre que arthur.

    [WebSites addObject:newSite]; pose problème je me prends l’erreur suivante : reason: ‘-[__NSArrayI addObject:]: unrecognized selector sent to instance

    il me dit que mon array n’est pas instancié

  22. hafondecran
    4 août 2011

    Bonjour et encore super Tuto;

    Idem pour moi erreur :
    -[__NSArrayI addObject:]: unrecognized selector sent to instance

    ça fait 2 jour que je cherche ……..

    Sinon vivement la suite

  23. ccb
    11 août 2011

    Terrible ce tuto !
    merci beaucoup et vivement la suite!

  24. Cill
    11 août 2011

    @hafondecran et @Rymn

    Pouvez vous nous montrer comment vous avez défini votre variable « WebSites »? (j’insiste sur le mot: montrer)

    parce que Rymn a écrit:

    [WebSites addObject:newSite];

    alors que dans le tutorial il est marqué:
    [tabWebSites addObject:newSite];

    je rappel qu’en objective c les variables sont sensibles aux majuscules et aux minuscules.
    (par exemple: « WebSites » est différent de « websites »).

  25. 2 oct 2011

    Merci beaucoup pour ce tuto très bien mené, a quand la suite ;-)

  26. rfb33
    5 déc 2011

    Bravo et Merci
    La suite!!! la suite!!! la suite!!!
    eh oui à force de faire du bon boulot on attend la suite!!! la suite!!!

  27. Ludo
    6 déc 2011

    J’ai adoré suivre l’intégralité des tutoriels sur le site et j’ai vraiment hâte de voir la suite. Ca fait plaisir de trouver des tutos de qualités et en français en plus.

    Jusque la, même si j’avais un souci je trouvais la solution directement dans les commentaires. Par contre la, je sèche complètement.

    Lorsque j’appuie sur save, l’appli crash et j’ai ceci qui : __TERMINATING_DUE_TO_UNCAUGHT__EXCEPTION__

    A noter que je travail sous Xcode 3.1.4. Je suis pas vraiment doué pour repérer les bugs donc si je peux donner plus d’informations où carrément vous transférer mon projet. Je pense que c’est une petite erreur (je l’espère) mais mon manque d’expérience dans le domaine doit m’aveugler.

    J’espère trouver de l’aide ici et si je trouve je partagerai ;)

    Merci !

  28. Ludo
    6 déc 2011

    En regardant et farfouillant, je crois que c’est cette ligne qui coince.
    [tabWebSites addObject:newSite];

    Pourtant j’ai vérifié de long en large. Est-ce que c’est possible que ce soit dû à ma version de XCode ?

  29. rvb33
    6 déc 2011

    Bonjour,
    Bravo mais ca ne marche pas chez moi.
    Difference entre websites et tabwebsites ????

  30. rvb33
    6 déc 2011

    Bonjour et encore super Tuto;
    Idem pour moi erreur :
    -[__NSArrayI addObject:]: unrecognized selector sent to instance

    pas d’explications ????

    Merci

  31. rfb33
    8 déc 2011

    ouh ouh! y personne?

  32. rfb33
    8 déc 2011

    ouh ouh! y a personne?

  33. Fred
    30 nov 2012

    Bonjour,

    Je dois vous avouer débuter en programmation IOS et pour apprendre ces tutoriels sont excellents.

    Cependant en suivant ce tutoriel je reste bloqué au niveau de l’ajout du bouton « cancel » dans la modal view.
    J’ai suivi le code et les instructions à la lettre mais aucun bouton ne s’affiche dans ma modal view. j’ai donc essayé d’en ajouter graphiquement, comme le bouton « + ».
    Le programme passe bien dans la fonction cancel: cependant je reste toujours sur la modal view.
    Aurriez-vous une solution?

    En vous remerciant par avance.

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires