{"id":1742,"date":"2014-09-28T20:22:19","date_gmt":"2014-09-29T00:22:19","guid":{"rendered":"http:\/\/tim.cstj.qc.ca\/cours\/xcode\/wp\/?page_id=1742"},"modified":"2014-09-28T20:22:19","modified_gmt":"2014-09-29T00:22:19","slug":"les-amis-de-la-science","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/xcode\/les-amis-de-la-science\/","title":{"rendered":"Les amis de la science"},"content":{"rendered":"<h1>Introduction \u00e0 &lsquo;UITableView&rsquo; et &lsquo;UICollectionView&rsquo;<\/h1>\n<h4><span style=\"color: #ff0000;\"><span style=\"color: #800080;\">Note: Ce document a \u00e9t\u00e9 converti vers Xcode 9 et swift 4<\/span><\/span><\/h4>\n<hr \/>\n<h2>\u00a0Mise en contexte:<\/h2>\n<p>Les classes <span style=\"color: #800080;\"><strong>UITableView<\/strong><\/span> et <span style=\"color: #800080;\"><strong>UICollectionView<\/strong><\/span> permettent \u00a0l\u2019affichage d\u2019une liste d\u2019\u00e9l\u00e9ments soit sur\u00a0une ou sur plusieurs colonnes.<br \/>\nExemples:<br \/>\n<div id=\"attachment_1799\" style=\"width: 342px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1799\" class=\"wp-image-1799 size-medium\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-20-332x600.png\" alt=\"amis-de-la-science-20\" width=\"332\" height=\"600\" \/><p id=\"caption-attachment-1799\" class=\"wp-caption-text\">UICollectionView<\/p><\/div><br \/>\n<div id=\"attachment_183\" style=\"width: 316px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-183\" class=\"wp-image-183 size-medium\" src=\"\/xcode\/wp-content\/uploads\/2013\/10\/timflix-figure08-306x600.png\" alt=\"timflix-figure08\" width=\"306\" height=\"600\" \/><p id=\"caption-attachment-183\" class=\"wp-caption-text\">UITableView<\/p><\/div><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/iOS-preferences.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2933\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/iOS-preferences.png\" alt=\"iOS-preferences\" width=\"306\" height=\"560\" \/><\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>UITableView<\/h1>\n<p>La classe UITableView permet l\u2019affichage d\u2019une liste d\u2019\u00e9l\u00e9ments sur\u00a0une seule colonne.<br \/>\nUITableView est une sous-classe de UIScrollView, qui permet aux utilisateurs de faire d\u00e9filer les \u00e9l\u00e9ments de la table.<br \/>\nC\u2019est une classe id\u00e9ale lorsqu\u2019il est n\u00e9cessaire d\u2019afficher une grande quantit\u00e9 de donn\u00e9es sous la forme d\u2019un tableau.<br \/>\nPar d\u00e9faut, UITableView propose des cellules qui contiennent un titre, un sous-titre, une image \u00e0 gauche et un accessoire \u00e0 droite.<br \/>\n<strong>Voici un exemple d&rsquo;un UITableView avec un titre, sous-titre et une image:<\/strong><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1813\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/tvcellstyle_subtitle.jpg\" alt=\"tvcellstyle_subtitle\" width=\"322\" height=\"482\" \/><br \/>\n<strong>Voici un exemple d&rsquo;un UITableView avec un\u00a0accessoire:<\/strong><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1816\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/tv_plain_style.jpg\" alt=\"tv_plain_style\" width=\"272\" height=\"408\" \/><\/p>\n<hr \/>\n<h1>Les protocoles<\/h1>\n<p><strong>UITableView<\/strong> et <strong>UICollectionView<\/strong> proposent deux protocoles: \u00a0dataSource et delegate (plus prefetchDataSource pour UICollectionView) .<br \/>\nIl est obligatoire de souscrire au protocole <strong>dataSource<\/strong> pour lier\u00a0les contr\u00f4les \u00e0 une source de donn\u00e9es.<br \/>\nPar exemple, si nous voulions utiliser un UICollectionView sur une sc\u00e8ne, il faudrait ajouter UICollectionViewDataSource \u00e0 la suite du nom de la super classe \u00a0du contr\u00f4leur de la sc\u00e8ne:<\/p>\n<blockquote><p>class ViewController: UIViewController, <span style=\"color: #800080;\"><strong>UICollectionViewDataSource<\/strong><\/span> {<br \/>\n\/\/ et<br \/>\nviewDidLoad(){<br \/>\n<strong>\u00a0 \u00a0<span style=\"color: #800080;\">unCV.dataSource = self<\/span><br \/>\n<\/strong>}<\/p><\/blockquote>\n<hr \/>\n<h1>Sources de donn\u00e9es<\/h1>\n<p>Les donn\u00e9es \u00e0 afficher, via UITableVite et UICollectionView peuvent provenir de trois sources:<\/p>\n<ol>\n<li>Un tableau cod\u00e9 en\u00a0dur.<\/li>\n<li>Un tableau cr\u00e9\u00e9 \u00e0 partir d&rsquo;un fichier de donn\u00e9e &#8211; liste de propri\u00e9t\u00e9s.<\/li>\n<li>Un tableau cr\u00e9\u00e9 suite \u00e0 une requ\u00eate lanc\u00e9e vers\u00a0une API web (plist, json, XML, &#8230;).<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>\u00c9tape1 &#8211; Afficher les \u00e9l\u00e9ments d&rsquo;un tableau<\/h1>\n<p>\u00c0 cette \u00e9tape, nous allons cr\u00e9er une application qui affiche, via un UITableView, les enregistrements d&rsquo;un tableau (Array) local.<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.0<\/strong><\/span> &#8211; <a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/Photos-Les-amis-de-la-science1.zip\">T\u00e9l\u00e9chargeons les ressources du projet<\/a><br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.1<\/strong><\/span> &#8211;\u00a0Cr\u00e9ons un nouveau projet \u00ab\u00a0Les amis de la science\u00a0\u00bb<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.2<\/strong><\/span>\u00a0&#8211; \u00a0Ajoutons, dans le groupe &lsquo;Ressources&rsquo;, \u00a0les ressources du\u00a0projet (t\u00e9l\u00e9charg\u00e9es \u00e0 l&rsquo;\u00e9tape 1.0)<br \/>\n<strong><span style=\"color: #ff0000;\">Action 1.3<\/span><\/strong> &#8211; \u00a0Rempla\u00e7ons le contenu du fichier &lsquo;ViewController.swift&rsquo; par;<\/p>\n<pre class=\"lang:swift decode:true \">\/\/\n\/\/  ViewController.swift\n\/\/  Les amis de la science\n\/\/\n\/\/  Cr\u00e9\u00e9 par Alain Boudreault le 2014-09-28.\n\/\/  Copyright (c) 2014-2016 Alain. All rights reserved.\n\/\/  ------------------------------------------------------------------\n\/\/  m-a-j: 2016.08.23 - conversion du projet vers Xcode 8 et swift 3\n\/\/         2016.10.16 - fin de la conversion vers swift 3\n\/\/         2017.10.15 - conversion vers Xcode 9 et swift 4\n\/\/  ------------------------------------------------------------------\nimport UIKit\nclass ViewController: UIViewController {\n    \/\/ ou bien: Array&lt;Dictionary&lt;String,String&gt;&gt;\n    let lesAmisDeLaScienceData:[Dictionary&lt;String,String&gt;] = [\n        [\"nom\":\"Albert Einstein\",       \"photo\":\"Albert Einstein.jpg\",          \"texte\":\"lorem ipsum01 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Albert Jacquard\",       \"photo\":\"Albert Jacquard.jpg\",          \"texte\":\"lorem ipsum02 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Blaise Pascal\",         \"photo\":\"Blaise Pascal.jpg\",            \"texte\":\"lorem ipsum03 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Braun\",                 \"photo\":\"Braun.jpg\",                    \"texte\":\"lorem ipsum04 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Christian Huygens\",     \"photo\":\"Christian Huygens.jpg\",        \"texte\":\"lorem ipsum05 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Daniel Fahrenheit\",     \"photo\":\"Daniel Fahrenheit.jpg\",        \"texte\":\"lorem ipsum06 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Dennis Ritchie\",        \"photo\":\"Dennis Ritchie.jpg\",           \"texte\":\"lorem ipsum07 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Galileo Galilei\",       \"photo\":\"Galil\u00e9e.jpg\",                  \"texte\":\"lorem ipsum08 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Henri Becquerel\",       \"photo\":\"Henri Becquerel.jpg\",          \"texte\":\"lorem ipsum09 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Heinrich Hertz\",        \"photo\":\"Hertz.jpg\",                    \"texte\":\"lorem ipsum10 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Jean Perrin\",           \"photo\":\"Jean Perrin.jpg\",              \"texte\":\"lorem ipsum11 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Karl Guthe Jansky\",     \"photo\":\"Karl Guthe Jansky.jpg\",        \"texte\":\"lorem ipsum12 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Marie Curie\",           \"photo\":\"Marie Curie.jpg\",              \"texte\":\"lorem ipsum13 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"James Clerk Maxwell\",   \"photo\":\"maxwell.jpg\",                  \"texte\":\"lorem ipsum14 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Steve Jobs\",            \"photo\":\"Steve Jobs.jpg\",               \"texte\":\"lorem ipsum15 ...\", \"naissance\":\"1900\"],\n        [\"nom\":\"Wilhelm Conrad Rontgen\",\"photo\":\"Wilhelm Conrad Rontgen.jpg\",   \"texte\":\"lorem ipsum16 ...\", \"naissance\":\"1900\"],\n    ] \/\/ lesAmisDeLaScienceData\n    \/\/ *****************************************************\n    override func viewDidLoad()\n    \/\/ *****************************************************\n    {\n        super.viewDidLoad()\n        if let nomFichierImage = lesAmisDeLaScienceData[0][\"photo\"] {\n            let uneImage = UIImageView(image: UIImage(named: nomFichierImage))\n            view.addSubview(uneImage)\n        } \/\/ if let\n    } \/\/ viewDidLoad\n}  \/\/ ViewController<\/pre>\n<p>&nbsp;<br \/>\n<strong><span style=\"color: #ff0000;\">Action 1.4<\/span><\/strong>\u00a0&#8211; Testons l&rsquo;application dans le simulateur.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1747\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-01.png\" alt=\"amis de la science 01\" width=\"321\" height=\"505\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.5<\/strong> <\/span>&#8211; Analysons le code; le tableau de dictionnaires et l&rsquo;image charg\u00e9e par programmation.<br \/>\n&nbsp;<br \/>\n<strong>Note<\/strong>: Par inf\u00e9rence, le tableau est sign\u00e9 [Dictionary &lt;String, String&gt;]. \u00a0Cela repr\u00e9sente le mode d&rsquo;utilisation le plus simple qui soit. \u00a0Il ne sera pas n\u00e9cessaire de signer les acc\u00e8s. \u00a0Par exemple, comme ceci:<\/p>\n<blockquote><p>(lesAmisDeLaScienceData[2] as Dictionary&lt;String, AnyObject&gt;)[\u00ab\u00a0nom\u00a0\u00bb] as String<\/p><\/blockquote>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.6<\/strong>\u00a0<\/span>&#8211; Glissons un UITableView sur la sc\u00e8ne<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1749\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Les-amis-de-la-science03.png\" alt=\"Les amis de la science03\" width=\"1026\" height=\"683\" \/><br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.7<\/strong>\u00a0<\/span>&#8211; Observons les protocoles disponibles pour l&rsquo;objet <strong>UITableView<\/strong>\u00a0.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1750\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-5.36.41-PM.png\" alt=\"Screen Shot 2014-09-28 at 5.36.41 PM\" width=\"272\" height=\"88\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.8<\/strong>\u00a0<\/span>&#8211;\u00a0Souscrivons, le contr\u00f4leur de la sc\u00e8ne, au protocole &lsquo;dataSource&rsquo; du UITableView.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1751\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Les-amis-de-la-science04.png\" alt=\"Les amis de la science04\" width=\"955\" height=\"810\" \/><br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.9<\/strong>\u00a0<\/span>&#8211; Ajoutons le nom du protocole \u00e0 la suite de la d\u00e9finition de la classe du contr\u00f4leur de la sc\u00e8ne.<br \/>\n<strong>Note<\/strong>: Cette op\u00e9ration est redonnante avec 1.8. \u00a0Elle permet d&rsquo;indiquer \u00e0 Xcode de nous afficher les m\u00e9thodes du protocole lorsqu&rsquo;en mode &lsquo;compl\u00e9tion de code&rsquo;.<\/p>\n<pre class=\"lang:swift mark:1 decode:true\">class ViewController: UIViewController, UITableViewDataSource {\n\/\/ Note: Cette ligne sera en erreur tant que les m\u00e9thodes obligatoires du\n\/\/ protocole dataSource ne seront pas d\u00e9clar\u00e9es dans la classe du contr\u00f4leur.\n}<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.10<\/strong>\u00a0<\/span>&#8211;\u00a0Mettons en commentaire les lignes suivantes de la m\u00e9thode &lsquo;viewDidLoad&rsquo;.<\/p>\n<pre class=\"lang:swift mark:7-8 decode:true\">    \/\/ *****************************************************\n    override func viewDidLoad()\n    \/\/ *****************************************************\n    {\n        super.viewDidLoad()\n    \/\/let uneImage = UIImageView(image: UIImage(named: lesAmisDeLaScienceData[0][\"photo\"]!))\n    \/\/view.addSubview(uneImage)\n    } \/\/ viewDidLoad\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>M\u00e9thodes obligatoires \u00a0du protocole dataSource<\/h1>\n<p>Lorsqu&rsquo;une de nos classes adopte le protocole &lsquo;<strong>dataSource&rsquo;<\/strong> de la classe &lsquo;<strong>UITableView<\/strong>&lsquo; \u00a0nous avons l&rsquo;obligation de programmer les deux m\u00e9thodes suivantes:<\/p>\n<ul>\n<li>tableView &#8211; numberOfRowsInSection<\/li>\n<li>tableView &#8211; cellForRowAtIndexPath<\/li>\n<\/ul>\n<p><strong><span style=\"color: #333399;\">La m\u00e9thode &lsquo;tableView &#8211; numberOfRowsInSection&rsquo;<\/span><\/strong> sert \u00e0 indiquer au &lsquo;TableView&rsquo; le nombre de lignes (enregistrements) \u00e0 afficher. \u00a0Habituellement,\u00a0cette m\u00e9thode retourne le nombre d&rsquo;\u00e9l\u00e9ments du tableau des donn\u00e9es.<br \/>\n<strong><span style=\"color: #333399;\">La m\u00e9thode &lsquo;tableView &#8211; cellForRowAtIndexPath&rsquo;<\/span><\/strong> sert \u00e0 fournir les donn\u00e9es \u00e0 utiliser pour faire le rendu de la cellule courante. \u00a0Cette m\u00e9thode est appel\u00e9 automatiquement \u00e0 chaque fois qu&rsquo;une cellule doit \u00eatre affich\u00e9e \u00e0 l&rsquo;\u00e9cran ou suite \u00e0 l&rsquo;utilisation de la m\u00e9thode UITableView.<span class=\"nl\" style=\"color: #2e0d6e;\">reloadData<\/span><span style=\"color: #808080;\">().<\/span><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.11<\/strong>\u00a0<\/span>&#8211; Ajoutons les m\u00e9thodes obligatoires du protocole dataSource \u00e0 la classe de la sc\u00e8ne principale:<br \/>\n<span style=\"color: #800080;\"><strong>tableView-&gt;numberOfRowsInSection<\/strong><\/span> et\u00a0<span style=\"color: #800080;\"><strong>tableView-&gt;cellForRowAt indexPath<\/strong><\/span><\/p>\n<pre class=\"lang:swift decode:true\">    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {\n        return lesAmisDeLaScienceData.count\n    } \/\/ numberOfRowsInSection\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        print(\"#Construction de la cellule num\u00e9ro: \\(indexPath.row)\")\n        return UITableViewCell()\n    } \/\/ cellForRowAt\n<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.12<\/strong>\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\nNote: Le TableView affiche &lsquo;lesAmisDeLaScience.count&rsquo; cellules vides.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1754\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-07.png.png\" alt=\"amis de la science 07.png\" width=\"321\" height=\"505\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.13<\/strong>\u00a0<\/span>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;tableView &#8211;\u00a0cellForRowAtIndexPath&rsquo;.<\/p>\n<pre class=\"lang:swift mark:2-4 decode:true\">\/\/ test 1\n\/\/ ----------------------------------------------------------------------\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        print(\"#Construction de la cellule num\u00e9ro: \\(indexPath.row)\")\n        let uneCellule = UITableViewCell()\n        uneCellule.textLabel!.text = \"Ceci est la description no \\(indexPath.row)\"\n        return uneCellule\n    } \/\/ cellForRowAt indexPath\n\/\/ ----------------------------------------------------------------------\n\/\/ test 2\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        print(\"#Construction de la cellule num\u00e9ro: \\(indexPath.row)\")\n        let uneCellule = UITableViewCell()\n        var nomDuScientifique = \"n\/a\"\n        if let _nom = lesAmisDeLaScienceData[indexPath.row][\"nom\"] {\n            nomDuScientifique = _nom\n        }\n        uneCellule.textLabel!.text = nomDuScientifique\n        return uneCellule\n    } \/\/ cellForRowAt indexPath\n<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.14<\/strong>\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1756\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-6.00.48-PM.png\" alt=\"Screen Shot 2014-09-28 at 6.00.48 PM\" width=\"321\" height=\"503\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.15<\/strong>\u00a0<\/span>&#8211;\u00a0Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;tableView\u00a0&#8211;\u00a0cellForRowAtIndexPath&rsquo;.<\/p>\n<pre class=\"lang:swift mark:10-12 decode:true\">    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        print(\"#Construction de la cellule num\u00e9ro: \\(indexPath.row)\")\n        let uneCellule = UITableViewCell()\n        var nomDuScientifique = \"n\/a\"\n        if let _nom = lesAmisDeLaScienceData[indexPath.row][\"nom\"] {\n            nomDuScientifique = _nom\n        }\n        uneCellule.textLabel!.text = nomDuScientifique\n        if let fichierImage = lesAmisDeLaScienceData[indexPath.row][\"photo\"] {\n            uneCellule.imageView!.image = UIImage(named:fichierImage)\n        }\n        return uneCellule\n    } \/\/ cellForRowAt indexPath<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.16<\/strong>\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1758\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-6.10.11-PM.png\" alt=\"Screen Shot 2014-09-28 at 6.10.11 PM\" width=\"323\" height=\"503\" \/><br \/>\n&nbsp;<br \/>\nNote: Si \u00a0le d\u00e9filement ne fonctionne pas correctement, ajustez les contraintes de mise en page du UITableView:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1760\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-6.13.42-PM.png\" alt=\"Screen Shot 2014-09-28 at 6.13.42 PM\" width=\"276\" height=\"413\" \/><\/p>\n<hr \/>\n<h1>Une table avec une cellule personnalis\u00e9e<\/h1>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.17<\/strong>\u00a0<\/span>&#8211; Ajoutons un objet &lsquo;<strong>UITableViewCell<\/strong>&lsquo; au tableView de la sc\u00e8ne.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1762\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Les-amis-de-la-science09.png\" alt=\"Les amis de la science09\" width=\"1033\" height=\"422\" \/><br \/>\n&nbsp;<br \/>\nPour avoir acc\u00e8s aux \u00e9l\u00e9ments que nous placerons dans la cellule, il faut y associer une classe perso.<br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.18<\/strong>\u00a0<\/span>&#8211;\u00a0Ajoutons une nouvelle classe au projet. \u00a0Cette classe doit \u00e9tendre la classe &lsquo;UITableViewCell&rsquo;.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1763\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-6.33.27-PM.png\" alt=\"Screen Shot 2014-09-28 at 6.33.27 PM\" width=\"733\" height=\"430\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.19<\/strong>\u00a0<\/span>&#8211; Associons\u00a0\u00a0la classe \u00ab\u00a0Savant\u00a0\u00bb \u00e0 la nouvelle cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1764\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-6.35.09-PM.png\" alt=\"Screen Shot 2014-09-28 at 6.35.09 PM\" width=\"1208\" height=\"245\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.19.2<\/strong>\u00a0<\/span>&#8211; Renseignons la propri\u00e9t\u00e9 &lsquo;Identifier&rsquo; de la cellule avec la chaine \u00ab\u00a0celluleSavant\u00a0\u00bb. \u00a0Cela repr\u00e9sente une r\u00e9f\u00e9rence au design de la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1827\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-21.png\" alt=\"amis-de-la-science-21\" width=\"1037\" height=\"282\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.20<\/strong>\u00a0<\/span>&#8211; Pla\u00e7ons les \u00e9l\u00e9ments de design dans la cellule et d\u00e9finissons des liens MCV.<br \/>\n<span style=\"color: #ff0000;\">Attention<\/span>, assurons nous que l&rsquo;assistant \u00e9diteur affiche le contenu du fichier Savant.swift.<\/p>\n<pre class=\"lang:swift decode:true\">    @IBOutlet weak var savantNom: UILabel!\n    @IBOutlet weak var savantImage: UIImageView!\n    @IBOutlet weak var savantTexte: UITextView!\n    @IBOutlet weak var savantAge: UILabel!<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1767\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-7.38.15-PM.png\" alt=\"Screen Shot 2014-09-28 at 7.38.15 PM\" width=\"1539\" height=\"260\" \/><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.21<\/strong>\u00a0<\/span>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;tableView\u00a0&#8211;\u00a0cellForRowAtIndexPath&rsquo;.<\/p>\n<pre class=\"lang:swift mark:3-4,10,13,17 decode:true \">    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {\n        print(\"#Construction de la cellule num\u00e9ro: \\(indexPath.row)\")\n        var uneCellule:Savant\n        uneCellule = tableView.dequeueReusableCell(withIdentifier: \"celluleSavant\") as! Savant\n        var nomDuScientifique = \"n\/a\"\n        if let _nom = lesAmisDeLaScienceData[indexPath.row][\"nom\"] {\n            nomDuScientifique = _nom\n        }\n        uneCellule.savantNom.text = nomDuScientifique\n        if let fichierImage = lesAmisDeLaScienceData[indexPath.row][\"photo\"] {\n            uneCellule.savantImage.image = UIImage(named:fichierImage)\n        }\n        \/\/ En d\u00e9ballage forc\u00e9:\n        uneCellule.savantTexte.text = lesAmisDeLaScienceData[indexPath.row][\"texte\"]\n        return uneCellule\n    } \/\/ cellForRowAt indexPath<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 1.22<\/strong>\u00a0<\/span>&#8211;\u00a0Terminons le design de la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1769\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Screen-Shot-2014-09-28-at-8.02.48-PM.png\" alt=\"Screen Shot 2014-09-28 at 8.02.48 PM\" width=\"770\" height=\"1045\" \/><br \/>\n<span style=\"color: #ff0000;\"><strong>Note: <\/strong>\u00c0 partir de Xcode 9, le UITableView va tenter d&rsquo;ajuster la hauteur des cellules automatiquement. \u00a0Cela peut produire un r\u00e9sultat ind\u00e9sirable.<\/span><br \/>\n<span style=\"color: #ff0000;\">Il est possible de d\u00e9sactiver ce comportement dans l&rsquo;inspecteur de taille du UITableView en d\u00e9cochant la propri\u00e9t\u00e9 &lsquo;Row Height Automatic&rsquo;\u00a0<\/span><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/Capture-2017-10-15-13.46.34.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3240\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/Capture-2017-10-15-13.46.34.png\" alt=\"\" width=\"302\" height=\"103\" \/><\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>\u00c9tape 2 &#8211; Utilisation d&rsquo;un fichier de donn\u00e9es (plist)<\/h1>\n<p>\u00c0 cette \u00e9tape, nous remplacerons le \u00a0tableau cod\u00e9 en\u00a0dur par un tableau cr\u00e9\u00e9 \u00e0 partir d&rsquo;un fichier de donn\u00e9es livr\u00e9 avec l&rsquo;application.<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.2<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>Observons la structure du fichier &lsquo;amisDelaScience.plist&rsquo;. \u00a0Voir dans le groupe Ressources.Donn\u00e9es<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1778\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-011.png\" alt=\"amis-de-la-science-01\" width=\"989\" height=\"551\" \/> Action &#8211;<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.3<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Affichons la source du fichier de donn\u00e9es (Ctrl+Clic):<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1779\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-02.png\" alt=\"amis-de-la-science-02\" width=\"594\" height=\"198\" \/><br \/>\n&nbsp;<br \/>\n<strong>R\u00e9sultat<\/strong>:<\/p>\n<pre class=\"lang:swift decode:true \">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;!DOCTYPE plist PUBLIC \"-\/\/Apple\/\/DTD PLIST 1.0\/\/EN\" \"http:\/\/www.apple.com\/DTDs\/PropertyList-1.0.dtd\"&gt;\n&lt;plist version=\"1.0\"&gt;\n&lt;array&gt;\n\t&lt;dict&gt;\n\t\t&lt;key&gt;nom&lt;\/key&gt;\n\t\t&lt;string&gt;Albert Einstein&lt;\/string&gt;\n\t\t&lt;key&gt;photo&lt;\/key&gt;\n\t\t&lt;string&gt;Albert Einstein.jpg&lt;\/string&gt;\n\t\t&lt;key&gt;texte&lt;\/key&gt;\n\t\t&lt;string&gt;Il publie sa theorie de la relativite restreinte en 1905, et une theorie de la gravitation dite relativite generale en 1915.&lt;\/string&gt;\n\t\t&lt;key&gt;naissance&lt;\/key&gt;\n\t\t&lt;string&gt;1879&lt;\/string&gt;\n\t&lt;\/dict&gt;\n\t&lt;dict&gt;\n\t\t&lt;key&gt;nom&lt;\/key&gt;\n\t\t&lt;string&gt;Albert Jacquard&lt;\/string&gt;\n\t\t&lt;key&gt;photo&lt;\/key&gt;\n\t\t&lt;string&gt;Albert Jacquard.jpg&lt;\/string&gt;\n\t\t&lt;key&gt;texte&lt;\/key&gt;\n\t\t&lt;string&gt;Il est connu pour ses engagements citoyens, parmi lesquels la defense du concept de la decroissance soutenable, le soutien aux mouvements du logiciel libre, a la langue internationale esperanto, aux laisses-pour-compte et a l'environnement.&lt;\/string&gt;\n\t\t&lt;key&gt;naissance&lt;\/key&gt;\n\t\t&lt;string&gt;1925&lt;\/string&gt;\n\t&lt;\/dict&gt;\n...\n&lt;\/array&gt;\n&lt;\/plist&gt;<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.4<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211;\u00a0Dans le fichier &lsquo;ViewController.swift&rsquo;, rempla\u00e7ons la d\u00e9finition (cod\u00e9e au dur) du tableau des amis de la science par:<\/p>\n<pre class=\"lang:swift decode:true\">    \/\/ D\u00e9finition d'un tableau de dictionnaires\n    \/\/ Le dictionnaire est 'typ\u00e9' cl\u00e9 = String et contenu = String dans le but d'all\u00e9ger\n    \/\/ la syntaxe d'acc\u00e8s aux \u00e9l\u00e9ments du dictionnaire.\n    var lesAmisDeLaScienceData:Array&lt;Dictionary&lt;String,String&gt;&gt; = []\n<\/pre>\n<p>&nbsp;<br \/>\nLa classe <strong>NSArray<\/strong> &#8211; du\u00a0<span style=\"color: #545454;\">Foundation<\/span><span style=\"color: #545454;\">\u00a0framework<\/span>\u00a0&#8211; \u00a0propose un m\u00e9thode qui permet de cr\u00e9er un tableau \u00e0 partir d&rsquo;un fichier de propri\u00e9t\u00e9s:<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.5<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode viewDidLoad.<\/p>\n<pre class=\"lang:swift decode:true\">     override func viewDidLoad()\n    {\n        super.viewDidLoad()\n        let pathFichierPlist = Bundle.main.path(forResource: \"amisDelaScience\", ofType: \"plist\")!\n        print(\"#pathFichierPlist: \\(pathFichierPlist)\")\n        \/\/ Voir documentation pour Array VS NSArray:\n        \/\/ https:\/\/developer.apple.com\/reference\/swift\/array\n        \/\/ https:\/\/developer.apple.com\/reference\/foundation\/nsarray\n        lesAmisDeLaScienceData = NSArray(contentsOfFile: pathFichierPlist) as! Array\n    } \/\/ viewDidLoad<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>Note: Remarquez, dans la console, la complexit\u00e9 du chemin d&rsquo;acc\u00e8s vers le fichier &lsquo;amisDelaScience.plist.<\/strong><\/span><br \/>\n<strong style=\"color: #ff0000;\">Action 2.6<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211;\u00a0Testons notre modification<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1780\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-03.png\" alt=\"amis-de-la-science-03\" width=\"484\" height=\"878\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.7<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211;\u00a0Calculons l&rsquo;age du savant avec le code suivant.<\/p>\n<pre class=\"lang:swift decode:true\">\/\/   func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {\n        \/\/ Recette pour obtenir la valeur de l'ann\u00e9e courante\n        let date = Date()\n        let calendar = NSCalendar.current\n        let components = calendar.dateComponents([.year], from: date)\n        let anneeCourante = components.year\n        let anneeNaissance = lesAmisDeLaScienceData[(indexPath as NSIndexPath).row][\"naissance\"]!\n        print(\"# \\(anneeCourante), \\(anneeNaissance)\\n\")\n        uneCellule.savantAge.text = \"\\(anneeCourante! - Int(anneeNaissance)!) ans\"<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 2.8<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1781\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-04.png\" alt=\"amis-de-la-science-04\" width=\"482\" height=\"876\" \/><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>\u00c9tape 3 &#8211; CollectionView<\/h1>\n<p>La classe UICollectionView permet l\u2019affichage d\u2019une liste d\u2019\u00e9l\u00e9ments sur plusieurs\u00a0colonnes.<br \/>\nMise \u00e0 part le fait qu&rsquo;un UICollectionView ne propose pas une cellule avec des champs par d\u00e9faut, c-a-d qui faudra utiliser\u00a0une classe perso pour la cellule, cet objet se programme presque de la m\u00eame fa\u00e7on qu&rsquo;un UITableView.<br \/>\n&nbsp;<\/p>\n<hr \/>\n<p>Nous allons reprendre l&rsquo;exercice de l&rsquo;\u00e9tape 2 en utilisant un UICollectionView.<br \/>\n<del><strong style=\"color: #ff0000;\">Action 3.1<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ouvrir le storyboard du module 03.<\/del> Effa\u00e7ons le UICollectionView.<br \/>\n<strong style=\"color: #ff0000;\">Action 3.2<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Glissons un objet &lsquo;<strong>CollectionView<\/strong>&lsquo;, de la librairie vers la sc\u00e8ne.<br \/>\n<strong>Note<\/strong>: Remarquez qu&rsquo;il y a d\u00e9j\u00e0 une cellule \u00e0 personnaliser dans le UICollectionView.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1782\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-05.png\" alt=\"amis-de-la-science-05\" width=\"1204\" height=\"659\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.3<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajustons la taille et la couleur de fond &#8211; clear color &#8211; du collectionView ainsi que la taille de la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1783\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-07.png\" alt=\"amis-de-la-science-07\" width=\"660\" height=\"685\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.4<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; \u00c9laborons le design de la nouvelle cellule en y ajoutant un &lsquo;UILabel&rsquo; pour le nom, une image et une zone de texte au bas.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1784\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-08.png\" alt=\"amis-de-la-science-08\" width=\"613\" height=\"644\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.5<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Souscrivons le contr\u00f4leur de la sc\u00e8ne au protocole &lsquo;<strong>dataSource<\/strong>&lsquo; du UICollectionView.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1785\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-09.png\" alt=\"amis-de-la-science-09\" width=\"1000\" height=\"784\" \/><br \/>\nNote: Expliquer l&rsquo;op\u00e9ration par programmation:<\/p>\n<pre class=\"lang:swift mark:8-12 decode:true \">@IBOutlet weak var CVSavant: UICollectionView!\n...\n\u0010viewDidLoad(){\n  CVSavant.dataSource  = self\n<\/pre>\n<p><strong style=\"color: #ff0000;\">Action 3.6<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons le nom du protocole \u00e0 la suite de la d\u00e9finition de la classe du contr\u00f4leur de la sc\u00e8ne.<br \/>\nNote: Cette op\u00e9ration est redonnante avec 3.5. \u00a0Elle permet d&rsquo;indiquer \u00e0 Xcode de nous afficher les m\u00e9thodes du protocole lorsqu&rsquo;en mode &lsquo;compl\u00e9tion de code&rsquo;.<\/p>\n<pre class=\"lang:swift mark:1 decode:true\">class ViewController: UIViewController, UICollectionViewDataSource {\n\/\/ Note: Cette ligne sera en erreur tant que les m\u00e9thodes obligatoires du\n\/\/ protocole ne seront pas d\u00e9clar\u00e9es dans la classe du contr\u00f4leur.<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.<\/strong><span style=\"color: #ff0000;\">7\u00a0<\/span>&#8211; Ajoutons les m\u00e9thodes\u00a0\u00a0&lsquo;collectionView: numberOfItemsInSection&rsquo; et &lsquo;collectionView: \u00a0cellForItemAtIndexPath&rsquo; \u00e0 la classe de la sc\u00e8ne principale.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1786\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-10.png\" alt=\"amis-de-la-science-10\" width=\"1150\" height=\"139\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.8<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons le code suivant aux nouvelles m\u00e9thodes.<\/p>\n<pre class=\"lang:swift decode:true\">    \/\/MARK:- M\u00e9thodes du protocole UICollectionViewDataSource\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&gt; Int {\n        return lesAmisDeLaScienceData.count\n    } \/\/ numberOfItemsInSection\n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&gt; UICollectionViewCell {\n        return UICollectionViewCell() \/\/ Va faire planter l'application!\n    } \/\/ cellForItemAt indexPath<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.9<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211;\u00a0Testons l&rsquo;app.<br \/>\n<strong>Note<\/strong>: Il y aura une erreur \u00e0 l&rsquo;ex\u00e9cution.<\/p>\n<blockquote><p>2014-09-30 12:51:08.025 Les amis de la science[36210:2367199] *** Assertion failure in -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:],\/SourceCache\/UIKit_Sim\/UIKit-3318\/UICollectionView.m:1315<br \/>\n2014-09-30 12:51:08.028 Les amis de la science[36210:2367199] *** Terminating app due to uncaught exception &lsquo;NSInternalInconsistencyException&rsquo;, reason: &lsquo;the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier &#8211; cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:&rsquo;<br \/>\n&nbsp;<\/p><\/blockquote>\n<p><strong>Explication<\/strong> &#8211; \u00a0Il faut absolument recycler les cellules avec un \u00a0UICollectionView: \u00a0dequeueReusableCellWithReuseIdentifier.<br \/>\nIl faudra donc;<\/p>\n<ol>\n<li>Ajouter une nouvelle classe, d\u00e9riv\u00e9e de UICollectionViewCell, \u00e0 notre projet.<\/li>\n<li>Renseigner la propri\u00e9t\u00e9 &lsquo;Class&rsquo; de la cellule.<\/li>\n<li>Renseigner la propri\u00e9t\u00e9 &lsquo;Identifier&rsquo; de la cellule.<\/li>\n<li>Cr\u00e9er la cellule avec \u00a0la m\u00e9thode &lsquo;collectionView.dequeueReusableCellWithReuseIdentifier&rsquo;.<\/li>\n<\/ol>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.10<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; \u00a0Ajoutons une classe, d\u00e9riv\u00e9e de UICollectionViewCell, pour la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1787\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-11.png\" alt=\"amis-de-la-science-11\" width=\"732\" height=\"429\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.11<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Renseignons la propri\u00e9t\u00e9 &lsquo;Class&rsquo; de la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1788\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-12.png\" alt=\"amis-de-la-science-12\" width=\"710\" height=\"360\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.12<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211;\u00a0Renseignons la propri\u00e9t\u00e9 &lsquo;Identifier&rsquo; de la cellule avec la chaine suivante: \u00ab\u00a0modeleCelluleSavant\u00a0\u00bb.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1789\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-13.png\" alt=\"amis-de-la-science-13\" width=\"715\" height=\"365\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.13<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode\u00a0&lsquo;<strong>collectionView: \u00a0cellForItemAtIndexPath<\/strong>&lsquo;.<\/p>\n<pre class=\"lang:swift decode:true \">    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&gt; UICollectionViewCell {\n        var celluleCourante:CVCSavant\n        celluleCourante = collectionView.dequeueReusableCell(withReuseIdentifier: \"modeleCelluleSavant\", for:indexPath) as! CVCSavant\n        return celluleCourante\n    } \/\/ cellForItemAt indexPath<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.14<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1790\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-14.png\" alt=\"amis-de-la-science-14\" width=\"855\" height=\"504\" \/><br \/>\n<strong>Note<\/strong>: Le mod\u00e8le est maintenant utilis\u00e9e pour le rendu des cellules.<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.15<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons les d\u00e9clarations MVC suivantes au fichier &lsquo;CVCSavant.swift&rsquo;<\/p>\n<pre class=\"lang:swift decode:true\">\/\/  CVCSavant.swift\nimport UIKit\nclass CVCSavant: UICollectionViewCell {\n    @IBOutlet weak var savantNom: UILabel!\n    @IBOutlet weak var savantImage: UIImageView!\n    @IBOutlet weak var savantTexte: UITextView!\n}  \/\/ class CVCSavant<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.16<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Associons les d\u00e9clarations aux objets dans la cellule.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1791\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-15.png\" alt=\"amis-de-la-science-15\" width=\"938\" height=\"523\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.17<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;<strong>collectionView: \u00a0cellForItemAtIndexPath<\/strong>&lsquo;.<\/p>\n<pre class=\"lang:swift decode:true \">\/\/    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -&gt; UICollectionViewCell {\n\/\/ ...\n        \/\/ Renseigner les \u00e9lements de la cellule courante\n        \/\/ Recette pour obtenir la valeur de l'ann\u00e9e courante\n        let date = Date()\n        let calendar = NSCalendar.current\n        let components = calendar.dateComponents([.year], from: date)\n        let anneeCourante = components.year\n        let anneeNaissance = lesAmisDeLaScienceData[(indexPath as NSIndexPath).row][\"naissance\"]!\n        let age = \" - \\(anneeCourante! - Int(anneeNaissance)!) ans\"\n        celluleCourante.savantNom.text = lesAmisDeLaScienceData[indexPath.row][\"nom\"]! + age\n        celluleCourante.savantTexte.text = lesAmisDeLaScienceData[(indexPath as NSIndexPath).row][\"texte\"]!\n        celluleCourante.savantImage.image = UIImage(named: lesAmisDeLaScienceData[(indexPath as NSIndexPath).row][\"photo\"]!)\n\/\/        return celluleCourante\n\/\/    } \/\/ collectionView: cellForItemAtIndexPath<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.18<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1792\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-16.png\" alt=\"amis-de-la-science-16\" width=\"484\" height=\"878\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.19<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; \u00a0\u00c0 vous d&rsquo;ajuster le design.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1793\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-17.png\" alt=\"amis-de-la-science-17\" width=\"485\" height=\"877\" \/><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>Plusieurs mod\u00e8les de cellules<\/h1>\n<p>Il est possible d&rsquo;utiliser plusieurs mod\u00e8les de rendu pour les cellules personnalis\u00e9es de UITableView et UICollectionView.<br \/>\n<strong style=\"color: #ff0000;\">Action 3.20.a<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Copions\u00a0&#8211;\u00a0atl+glisser &#8211; la cellule du UICollectionVue.<br \/>\n<strong><span style=\"color: #ff0000;\">Attention<\/span><\/strong>, assurez-vous que la cellule est bien s\u00e9lectionn\u00e9e. \u00a0Au besoin, utilisez l&rsquo;explorateur de document.<br \/>\n<strong style=\"color: #ff0000;\">Action 3.20.b<\/strong>\u00a0<span style=\"color: #000000;\">&#8211; Corrigeons\u00a0\u00a0la propri\u00e9t\u00e9 &lsquo;Identifier&rsquo; de la nouvelle cellule pour &lsquo;modeleCelluleSavant2&rsquo;.<\/span><br \/>\n<strong>Note<\/strong>: Il n&rsquo;est pas n\u00e9cessaire de renseigner la propri\u00e9t\u00e9 &lsquo;class&rsquo;, la nouvelle cellule poss\u00e8de toutes les propri\u00e9t\u00e9s de la premi\u00e8re.<\/p>\n<h1><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1795\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-18.png\" alt=\"amis-de-la-science-18\" width=\"1169\" height=\"384\" \/><\/h1>\n<h1><\/h1>\n<p><strong style=\"color: #ff0000;\">Action 3.21<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Modifions le design du nouveau mod\u00e8le.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1796\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-19.png\" alt=\"amis-de-la-science-19\" width=\"356\" height=\"386\" \/><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.22<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Modifions le code suivant.<\/p>\n<pre class=\"lang:swift mark:4-6 decode:true\">\/\/    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -&gt; UICollectionViewCell {\n        \/\/ Recyclage obligatoire pour un UICollectionViewCell\n        let nomModele = indexPath.row % 2 == 0 ? \"modeleCelluleSavant\":\"modeleCelluleSavant2\"\n        celluleCourante = collectionView.dequeueReusableCell(withReuseIdentifier: nomModele, for:indexPath) as! CVCSavant\n<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 3.23<\/strong><span style=\"color: #ff0000;\">\u00a0<\/span>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1799\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-20.png\" alt=\"amis-de-la-science-20\" width=\"485\" height=\"876\" \/><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1><span style=\"color: #ff0000;\">Laboratoire \u00e0 r\u00e9aliser par l&rsquo;\u00e9tudiant avant l&rsquo;\u00e9tape 4<\/span><\/h1>\n<p><a href=\"\/xcode\/wp-content\/uploads\/2013\/10\/Liste-de-mes-amis-collectionView-depart.zip\">Mes amis \u2013 Fichiers de d\u00e9part<\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>\u00c9tape 4 &#8211; Segue<\/h1>\n<p>&nbsp;<br \/>\n\u00c0 cette \u00e9tape nous allons programmer, suite \u00e0 la s\u00e9lection d&rsquo;une cellule par l&rsquo;utilisateur, un d\u00e9placement &#8211; segue &#8211; vers une sc\u00e8ne affichant les informations de la s\u00e9lection courante.<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.\u00a0<\/strong>&#8211; \u00a0Ajoutons et \u00e9laborons une sc\u00e8ne, pour les informations\u00a0du savant,<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1951\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-01-735x600.png\" alt=\"amis-de-la-science-etape4-01\" width=\"735\" height=\"600\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.2\u00a0<\/strong>&#8211; Ajoutons une nouvelle classe au projet pour la sc\u00e8ne &lsquo;D\u00e9tails&rsquo; nomm\u00e9e &lsquo;VCDetails&rsquo;<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-06.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1952\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-06.png\" alt=\"amis-de-la-science-etape4-06\" width=\"731\" height=\"431\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.3\u00a0<\/strong>&#8211; Associons\u00a0\u00a0la classe &lsquo;VCDetails&rsquo; \u00e0 la sc\u00e8ne &lsquo;D\u00e9tails&rsquo;.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-07.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1953\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-07.png\" alt=\"amis-de-la-science-etape4-07\" width=\"651\" height=\"331\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.4\u00a0<\/strong>&#8211; D\u00e9finissons un @IBAction entre le bouton de retour en arri\u00e8re et la classe de la sc\u00e8ne &lsquo;D\u00e9tails&rsquo;.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-08.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1954\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-08-800x394.png\" alt=\"amis-de-la-science-etape4-08\" width=\"800\" height=\"394\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.5\u00a0<\/strong>&#8211; Ajoutons, \u00e0 la m\u00e9thode &lsquo;retourALaListe&rsquo; \u00a0le code suivant:<\/p>\n<pre class=\"lang:swift decode:true \">        dismiss(animated: true, completion: nil)\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h1>D\u00e9finition des liens segues<\/h1>\n<p>&nbsp;<br \/>\nPour d\u00e9finir un segue entre une cellule d&rsquo;un tableView ou d&rsquo;un CollectionView,\u00a0il suffit de &lsquo;<strong>Ctrl+Glisser&rsquo;<\/strong> \u00a0la cellule vers la View de la sc\u00e8ne de destination.<br \/>\n<strong>Note<\/strong>: S&rsquo;il y a plusieurs cellules, il faut alors recommencer cette op\u00e9ration pour toutes les cellules restantes.<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.6\u00a0<\/strong>&#8211; D\u00e9finissons un segue de type &lsquo;present modally&rsquo;, \u00e0 partir de la premi\u00e8re cellule, vers la sc\u00e8ne &lsquo;D\u00e9tails&rsquo;.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-02b.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1955\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-02b-800x551.png\" alt=\"amis-de-la-science-etape4-02b\" width=\"800\" height=\"551\" \/><\/a><br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1956\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-03.png\" alt=\"amis-de-la-science-etape4-03\" width=\"147\" height=\"76\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.7\u00a0<\/strong>&#8211; Recommen\u00e7ons la man\u0153uvre sur la deuxi\u00e8me cellule.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-04b.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1957\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-04b-800x545.png\" alt=\"amis-de-la-science-etape4-04b\" width=\"800\" height=\"545\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.8\u00a0<\/strong>&#8211; Observons le r\u00e9sultat obtenu.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-05b.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1958\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-05b-722x600.png\" alt=\"amis-de-la-science-etape4-05b\" width=\"722\" height=\"600\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.9\u00a0<\/strong>&#8211; Testons l&rsquo;application.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1959\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-09.png\" alt=\"amis-de-la-science-etape4-09\" width=\"322\" height=\"593\" \/><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>PrepareForSegue<\/h1>\n<p>La classe UIViewController propose la m\u00e9thode &lsquo;prepareForSegue&rsquo; comme moyen de passer des informations \u00e0 la sc\u00e8ne de destination lors d&rsquo;un segue.<br \/>\nCelle m\u00e9thode est programm\u00e9e dans le contr\u00f4leur de la sc\u00e8ne de d\u00e9part; celle qui pr\u00e9sente le TableView ou le CollectionView.<br \/>\nVoici sa signature:<\/p>\n<blockquote><p><span style=\"color: #c32275;\">override<\/span> <span style=\"color: #c32275;\">func<\/span> prepareForSegue(segue: <span style=\"color: #6122ae;\">UIStoryboardSegue<\/span>, sender: <span style=\"color: #6122ae;\">AnyObject<\/span>?)<\/p><\/blockquote>\n<p>&nbsp;<br \/>\nLa m\u00e9thode re\u00e7oit (lors de l&rsquo;appel) une r\u00e9f\u00e9rence vers la destination ainsi qu&rsquo;une r\u00e9f\u00e9rence sur l&rsquo;objet &#8211; habituellement une cellule &#8211; ayant re\u00e7u l&rsquo;\u00e9v\u00e9nement d\u00e9clencheur du segue.<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.10\u00a0<\/strong>&#8211; Ajoutons le code suivant au contr\u00f4leur de la sc\u00e8ne principale:<\/p>\n<pre class=\"lang:swift decode:true\">    \/\/ M\u00e9thode ex\u00e9cut\u00e9e automatiquement avant un segue\n    \/\/MARK:- Pr\u00e9parer le d\u00e9placement (segue)\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        print(\"# Ex\u00e9cution de la m\u00e9thode: prepare:for segue\\n\")\n    } \/\/ prepare(for segue: ...)<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.11\u00a0<\/strong>&#8211; Testons l&rsquo;application (faire plusieurs s\u00e9lections).<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-10.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1961\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-10.png\" alt=\"amis-de-la-science-etape4-10\" width=\"473\" height=\"129\" \/><\/a><br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.12\u00a0<\/strong>&#8211; D\u00e9finissons un @IBOutlet sur le collectionView.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-11.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1962\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-11.png\" alt=\"amis-de-la-science-etape4-11\" width=\"677\" height=\"579\" \/><\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>indexPathForCell<\/h1>\n<p>&nbsp;<br \/>\nLes classes UITableView et UICollectionView proposent la m\u00e9thode &lsquo;indexPathForCell(uneCellule)&rsquo; pour connaitre la position d&rsquo;une cellule.<br \/>\nLors de l&rsquo;ex\u00e9cution de la m\u00e9thode &lsquo;<strong>prepareForSegue&rsquo;<\/strong>, nous recevons une r\u00e9f\u00e9rence (<strong>sender: Any?<\/strong>) \u00e0 la cellule s\u00e9lectionn\u00e9e.<br \/>\nPar cons\u00e9quent, \u00a0 le code suivant permet de connaitre l&rsquo;indice de la cellule s\u00e9lectionn\u00e9e:<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.13\u00a0<\/strong>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;<strong>prepareForSegue<\/strong>&lsquo;.<\/p>\n<pre class=\"lang:swift decode:true\">    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        \/\/ Note: Il faut avoir renseign\u00e9 un @IBOutlet sur le UICollectionView\n        let selection = CVSavant.indexPath(for: sender as! UICollectionViewCell)!.row\n        print(\"# Ex\u00e9cution de la m\u00e9thode: prepareForSegue pour la cellule num\u00e9ro: \\(selection)\\n\")\n    } \/\/ prepare(for segue: ...)<\/pre>\n<p>&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.14\u00a0<\/strong>&#8211; Testons l&rsquo;application.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1963\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-12.png\" alt=\"amis-de-la-science-etape4-12\" width=\"774\" height=\"109\" \/><\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>segue.destinationViewController<\/h1>\n<p>&nbsp;<br \/>\nIl nous reste maintenant \u00e0 passer les informations de la s\u00e9lection courante \u00e0 la sc\u00e8ne de d\u00e9tails.<br \/>\nLa m\u00e9thode &lsquo;<strong>prepareForSegue<\/strong>&lsquo; nous renseigne aussi sur la\u00a0destination: <strong>\u00a0\u0003(segue<span style=\"color: #000000;\">: <\/span>UIStoryboardSegue).<\/strong><\/p>\n<p style=\"color: #6122ae;\"><span style=\"color: #000000;\"><strong>segue.destinationViewController<\/strong> -&gt; pointe sur l&rsquo;instance de classe du contr\u00f4leur de la sc\u00e8ne de destination. <\/span><\/p>\n<p style=\"color: #6122ae;\"><span style=\"color: #000000;\">Donc, avec le code suivant, nous aurons acc\u00e8s aux propri\u00e9t\u00e9s publiques du contr\u00f4leur de la sc\u00e8ne de destination:<\/span><\/p>\n<blockquote>\n<p style=\"color: #6122ae;\">var destination = segue.destinationViewController as VCDetails<br \/>\ndestination.uneVariable = &#8230;<\/p>\n<p>&nbsp;<\/p><\/blockquote>\n<p><strong style=\"color: #ff0000;\">Action 4.15\u00a0<\/strong><span style=\"color: #6122ae;\">&#8211; \u00a0<\/span><span style=\"color: #000000;\">Ajoutons le code suivant au\u00a0<\/span><span style=\"color: #000000;\">contr\u00f4leur VCDetails.<\/span><\/p>\n<pre class=\"lang:swift mark:3,7 decode:true \">class VCDetails: UIViewController {\n    \/\/ Propri\u00e9t\u00e9 pour recevoir les informations de la s\u00e9lection\n    var informationsDuSavantCourant =  Dictionary&lt;String,String&gt; ()\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        print(\"# Nous avons re\u00e7u les donn\u00e9es suivantes:\\(informationsDuSavantCourant)\\n\")\n    } \/\/ viewDidLoad\n<\/pre>\n<p>&nbsp;<br \/>\n<span style=\"color: #000000;\">\u00a0<\/span><strong style=\"color: #ff0000;\">Action 4.16\u00a0<\/strong>&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode prepareForSegue \u00a0de ViewController.swift.<br \/>\n&nbsp;<\/p>\n<pre class=\"lang:swift mark:8-12 decode:true\">    \/\/MARK:- Pr\u00e9parer le d\u00e9placement (segue)\n    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n        \/\/ Note: Il faut avoir renseign\u00e9 un @IBOutlet sur le UICollectionView\n        \/\/ 1 - D\u00e9terminer l'index de la s\u00e9lection \u00e0 partir de la cellule re\u00e7ue en param\u00e8tre (sender)\n        let selection = CVSavant.indexPath(for: sender as! UICollectionViewCell)!.row\n        yo(dans: String(selection))\n        print(\"# Ex\u00e9cution de la m\u00e9thode: prepareForSegue pour la cellule num\u00e9ro: \\(selection)\\n\")\n        \/\/ 2 - Cr\u00e9er un objet pointant sur l'instance de classe de la destination\n        let destination = segue.destination as! VCDetails\n        \/\/ 3 - Passer les informations au controleur de destination\n        destination.informationsDuSavantCourant = lesAmisDeLaScienceData[selection]\n    } \/\/ prepare(for segue: ...)<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<br \/>\n<strong style=\"color: #ff0000;\">Action 4.17\u00a0<\/strong>&#8211; Testons l&rsquo;application.<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1967\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-13-800x160.png\" alt=\"amis-de-la-science-etape4-13\" width=\"800\" height=\"160\" \/><\/a><br \/>\n&nbsp;<br \/>\n<span style=\"color: #ff0000;\"><strong style=\"color: #ff0000;\">Action 4.18\u00a0<\/strong>&#8211; En faire en laboratoire: \u00a0Vous devez d\u00e9finir des IBOutlet sur les objets de la sc\u00e8ne &lsquo;D\u00e9tails&rsquo; et afficher, sur la sc\u00e8ne, les informations re\u00e7ues.<\/span><br \/>\n&nbsp;<br \/>\nR\u00e9sultat:<br \/>\n&nbsp;<br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-14.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1968\" src=\"\/xcode\/wp-content\/uploads\/2014\/09\/amis-de-la-science-etape4-14.png\" alt=\"amis-de-la-science-etape4-14\" width=\"323\" height=\"592\" \/><\/a><br \/>\n&nbsp;<\/p>\n<hr \/>\n<h1>5 &#8211; Extra<\/h1>\n<p>Et si le fichier de donn\u00e9es provenait du monde exterieur?<br \/>\nPar exemple, au bout d&rsquo;un URL comme, <a href=\"http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/amisDelaScience.plist\">http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/amisDelaScience.plist<\/a><br \/>\n<span style=\"color: #ff0000;\"><strong>Action 5.1<\/strong><\/span>\u00a0&#8211; Ajoutons le code suivant \u00e0 la m\u00e9thode &lsquo;viewDidLoad&rsquo;:<\/p>\n<pre class=\"lang:swift decode:true \">        let strURL = \"http:\/\/prof-tim.cstj.qc.ca\/cours\/xcode\/sources\/amisDelaScience.plist\"\n        if let uneURL = URL(string: strURL) {\n            if let _donn\u00e9es = NSArray(contentsOf: uneURL) as? Array&lt;Dictionary&lt;String, String&gt;&gt; {\n                lesAmisDeLaScienceData = _donn\u00e9es\n                print(_donn\u00e9es)\n            } else\n            {\n                print(\"\\n\\n#Erreur: impossible de cr\u00e9er un tableau \u00e0 partir du fichier... \\(strURL)\\n\\n\")\n            } \/\/ Probl\u00e8me avec l'URL\n        }  else {\n            print(\"\\n\\n#Erreur: impossible de lire les donn\u00e9es via \\(strURL)\\n\\n\")\n        }<\/pre>\n<p><span style=\"color: #ff0000;\">Note: Depuis iOS 10, la s\u00e9curit\u00e9 a \u00e9t\u00e9 augment\u00e9.<\/span><br \/>\nIl faut permettre les connexions arbitraires de l&rsquo;application:<br \/>\n<span style=\"color: #ff0000;\"><strong>Action 5.2<\/strong><\/span>\u00a0&#8211; . Ajoutons la cl\u00e9 suivante dans le fichier <strong><span style=\"color: #800080;\">info.plist<\/span><\/strong><\/p>\n<blockquote><p>&lt;key&gt;NSAppTransportSecurity&lt;\/key&gt;<br \/>\n&lt;dict&gt;<br \/>\n&lt;key&gt;NSAllowsArbitraryLoads&lt;\/key&gt;<br \/>\n&lt;true\/&gt;<br \/>\n&lt;\/dict&gt;<\/p><\/blockquote>\n<hr \/>\n<p><a href=\"https:\/\/github.com\/puyansude\/Les-amis-de-la-science\/archive\/master.zip\">solution du laboratoire<\/a><br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<br \/>\nFin du document<\/p>\n<h6 style=\"text-align: right;\">Pr\u00e9par\u00e9 par Alain Boudreault, aka VE2CUY, aka puyansude &#8211; 2014.09 &#8211; r\u00e9vision du 2016.10.16 pour Xcode 8 et swift 3<\/h6>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction \u00e0 &lsquo;UITableView&rsquo; et &lsquo;UICollectionView&rsquo; Note: Ce document a \u00e9t\u00e9 converti vers Xcode 9 et swift 4 \u00a0Mise en contexte: Les classes UITableView et UICollectionView permettent \u00a0l\u2019affichage d\u2019une liste d\u2019\u00e9l\u00e9ments soit sur\u00a0une ou sur plusieurs colonnes. Exemples: &nbsp; UITableView La classe UITableView permet l\u2019affichage d\u2019une liste d\u2019\u00e9l\u00e9ments sur\u00a0une seule colonne. UITableView est une sous-classe de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1742","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/1742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/comments?post=1742"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/1742\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/media?parent=1742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}