{"id":829,"date":"2014-06-17T16:03:45","date_gmt":"2014-06-17T20:03:45","guid":{"rendered":"http:\/\/tim.cstj.qc.ca\/cours\/xcode\/wp\/?page_id=829"},"modified":"2014-06-17T16:03:45","modified_gmt":"2014-06-17T20:03:45","slug":"les-copiercoller-swift","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/xcode\/les-copiercoller-swift\/","title":{"rendered":"Les copier\/coller &#8211; Swift"},"content":{"rendered":"<h3>Contenu<\/h3>\n<ol>\n<li><a href=\"#a1\">Afficher une trace<\/a><\/li>\n<li><a href=\"#a2\">Cha\u00eene de caract\u00e8res<\/a><\/li>\n<li><a href=\"#a3\">Cha\u00eene de caract\u00e8res avec interpolation<\/a><\/li>\n<li><a href=\"#a4\">Cha\u00eene &#8211; concat\u00e9nation<\/a><\/li>\n<li><a href=\"#a5\">Cr\u00e9er un tableau \u00e0 partir d&rsquo;un fichier de propri\u00e9t\u00e9s<\/a><\/li>\n<li><a href=\"#a6\">Charger une image par programmation<\/a><\/li>\n<li><a href=\"#a7\">Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran<\/a>)<\/li>\n<li><a href=\"#a8\">Lire la s\u00e9lection d&rsquo;un UISegmentedControl<\/a><\/li>\n<li><a href=\"#a9\">Libre<\/a><\/li>\n<li><a href=\"#a10\">Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente<\/a><\/li>\n<li><a href=\"#a11\">UITableView &#8211; d\u00e9l\u00e9gation<\/a><\/li>\n<li><a href=\"#a12\">Afficher une UITableViewCell perso<\/a><\/li>\n<li><a href=\"#a13\">UICollectionView &#8211; d\u00e9l\u00e9gation<\/a><\/li>\n<li><a href=\"#a14\">Cr\u00e9er une tableau d&rsquo;images \u00e0 partir de fichiers\\(i).png et animer<\/a><\/li>\n<li><a href=\"#a15\">Cr\u00e9er une image \u00e0 partir d&rsquo;une URL &#8211; Solution bloquante et non bloquante<\/a><\/li>\n<li><a href=\"#a16\">Cr\u00e9er une tableau \u00e0 partir d&rsquo;un r\u00e9sultat JSON via le web<\/a><\/li>\n<li><a href=\"#a17\">Pr\u00e9parer un segue<\/a><\/li>\n<li><a href=\"#a18\">Ex\u00e9cuter une m\u00e9thode apr\u00e8s un d\u00e9lai<\/a><\/li>\n<li><a href=\"#a19\">Programmer un NSTimer<\/a><\/li>\n<li><a href=\"#a20\">Afficher un Alert<\/a><\/li>\n<li><a href=\"#a21\">Charger une sc\u00e8ne (NIB, XIB, View) par programmation<\/a><\/li>\n<li><a href=\"#a22\">Animer une propri\u00e9t\u00e9<\/a><\/li>\n<li><a href=\"#a23\">D\u00e9tecter une collision entre deux UIView<\/a><\/li>\n<li><a href=\"#a24\">Ins\u00e9rer une\u00a0&lsquo;View&rsquo; dans une &lsquo;View&rsquo; parent, \u00a0\u00e0 la position parentViewCount &#8211; n<\/a><\/li>\n<li><a href=\"#a25\">Obtenir l&rsquo;\u00e9l\u00e9ment d&rsquo;un dictionnaire<\/a><\/li>\n<li><a href=\"#a26\">Array &#8211; cod\u00e9 au dur<\/a><\/li>\n<li><a href=\"#a27\">Array &#8211; \u00e9num\u00e9ration rapide<\/a><\/li>\n<li><a href=\"#a28\">Dictionnary &#8211; cod\u00e9 au dur<\/a><\/li>\n<li><a href=\"#a29\">Dictionnary &#8211; \u00e9num\u00e9ration rapide<\/a><\/li>\n<li><a href=\"#a30\">Afficher heure actuelle avec format<\/a><\/li>\n<li><a href=\"#a31\">Cr\u00e9er un UIButton + event par programmation<\/a><\/li>\n<li><a href=\"#a32\">Capturer l&rsquo;\u00e9cran dans\u00a0un UIImage<\/a><\/li>\n<li><a href=\"#a33\">Poster vers Facebook<\/a><\/li>\n<li><a href=\"#a34\">Poster vers twitter<\/a><\/li>\n<li><a href=\"#a35\">Masquer le clavier<\/a><\/li>\n<li><a href=\"#a36\">Programmer une d\u00e9l\u00e9gation (UITextField)<\/a><\/li>\n<li>Ajouter la gestion des versions \u00e0 un projet existant<\/li>\n<li>Stub AppDelegate.swift pour Xcode 6.4<\/li>\n<li>Git \u00e0 partir du terminal (pour un projet en \u00e9quipe)<\/li>\n<li>Variables globales<\/li>\n<li>\u00a0Prendre une pause<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<br \/>\n<a name=\"a1\"><\/a><br \/>\n<a name=\"a1\"><\/a><a name=\"a1\"><\/a><\/p>\n<h3>1. Afficher une trace<\/h3>\n<p><a name=\"a1\"><\/a><a name=\"a1\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">println(\"Bonjour le monde...\")\nlet pi = 3.141592\nprintln(\"La valeur de pi est \\(pi)\")\nlet a=3, b=7\nprintln(\"\\(a) + \\(b) = \\(a+b)\")\nlet unNom = \"TIM le magnifique\"\nprint(\"\\(unNom) dit: Bonjour \");print(\"\u00e0 tous!\\n\")<\/pre>\n<p><a name=\"a1\"><\/a><br \/>\n<a name=\"a2\"><\/a><br \/>\n<a name=\"a2\"><\/a><a name=\"a2\"><\/a><\/p>\n<h3>2. Cha\u00eene de caract\u00e8res<\/h3>\n<p><a name=\"a2\"><\/a><a name=\"a2\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let uneChaineRO = \"Je suis une chaine en lecture seule\"\nvar uneChaineRW = \"Je suis une chaine en lecture \u00e9criture\"\nvar uneChaineOC:NSString = \"Je suis une chaine Objective-C\"\nprintln(\"Il y a \\(countElements(uneChaineRO)) caract\u00e8res dans uneChaineRO\")\nprintln(\"Il y a \\(String(uneChaineOC.length)) caract\u00e8res dans uneChaineOC\")<\/pre>\n<p><a name=\"a2\"><\/a><br \/>\n<a name=\"a3\"><\/a><br \/>\n<a name=\"a3\"><\/a><a name=\"a3\"><\/a><\/p>\n<h3>3. Cha\u00eene de caract\u00e8res avec interpolation<\/h3>\n<p><a name=\"a3\"><\/a><a name=\"a3\"><\/a><\/p>\n<pre class=\"lang:default mark:4 decode:true\">let perso = \"Fantomas\"\nlet persoForce = 17\nvar message = \"Mon nom est \\(perso) et j'ai \\(persoForce) de force.\"<\/pre>\n<p><a name=\"a3\"><\/a><br \/>\n<a name=\"a4\"><\/a><br \/>\n<a name=\"a4\"><\/a><a name=\"a4\"><\/a><\/p>\n<h3>4. Cha\u00eene &#8211; concat\u00e9nation<\/h3>\n<p><a name=\"a4\"><\/a><a name=\"a4\"><\/a><\/p>\n<pre class=\"lang:default mark:4-5,10 decode:true\">var msg:String\nlet pi = 3.141592\nmsg = \"Bienvenue \" + \"Au cours d'intro \"\nmsg += \"du langage Swift. PI = \" + String(pi)\nvar res = \"\"\nfor car in msg {\n    res += car\n}<\/pre>\n<p><a name=\"a4\"><\/a><br \/>\n<a name=\"a5\"><\/a><br \/>\n<a name=\"a5\"><\/a><a name=\"a5\"><\/a><\/p>\n<h3>5. Cr\u00e9er un tableau avec un fichier<\/h3>\n<p><a name=\"a5\"><\/a><a name=\"a5\"><\/a><\/p>\n<pre class=\"lang:default mark:3-4 decode:true \">\/\/ \u00c9tant donn\u00e9 le fichier suivant:\n&lt;array&gt;\n  &lt;dict&gt;\n    &lt;key&gt;nom&lt;\/key&gt;\n    &lt;string&gt;Paul&lt;\/string&gt;\n    &lt;key&gt;photo&lt;\/key&gt;\n    &lt;string&gt;image01.png&lt;\/string&gt;\n    &lt;key&gt;dette&lt;\/key&gt;\n    &lt;real&gt;10.99&lt;\/real&gt;\n  &lt;\/dict&gt;\n...\n&lt;\/array&gt;\n\/\/ Cr\u00e9er un tableau avec m\u00e9thode: Swift + Foundation\nlet pathFichierPlist = NSBundle.mainBundle().pathForResource(\"liste des amis\", ofType: \"plist\")!\namis = NSArray(contentsOfFile: pathFichierPlist)\n\/\/\/ M\u00e9thode 100% swift (pas encore au point en version beta)\nvar tabloPerso:String[] = []\nlet path = NSBundle.mainBundle().pathForResource(\"personnages\", ofType: \"plist\")\ntabloPerso = NSArray(contentsOfFile: path) as String[]\nprintln(tabloPerso)\ntabloPerso.append(\"Tintin\")\nprintln(tabloPerso)\nprintln(tabloPerso[tabloPerso.count - 1])\n\/\/ Cr\u00e9er un tableau de 'Dictionary' \u00e0 partir d'un fichier plist\n\/\/ D\u00e9finition du tableau\nvar amis:[Dictionary&lt;String,String&gt;]!\n...\n\/\/ Affectation \u00e0 partir d'un fichier\namis = NSArray(contentsOfFile: NSBundle.mainBundle().pathForResource(\"liste des amis\", ofType: \"plist\")!) as [Dictionary&lt;String,String&gt;]\n<\/pre>\n<p><a name=\"a5\"><\/a><br \/>\n<a name=\"a6\"><\/a><br \/>\n<a name=\"a6\"><\/a><a name=\"a6\"><\/a><\/p>\n<h3>6. Charger une image par programmation<\/h3>\n<p><a name=\"a6\"><\/a><a name=\"a6\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let _image = UIImage(named:\"paysage\")\nself.uneImage.image = image\n\/\/ ou bien\nself.imageView.image = UIImage(named:\"image.png\")<\/pre>\n<p><a name=\"a6\"><\/a><a name=\"a7\"><\/a><br \/>\n<a name=\"a7\"><\/a><a name=\"a7\"><\/a><\/p>\n<h3>7. Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran)<\/h3>\n<p><a name=\"a7\"><\/a><a name=\"a7\"><\/a><\/p>\n<pre class=\"lang:swift decode:true\">    override func prefersStatusBarHidden() -&gt; Bool {\n        return true\n    }\n<\/pre>\n<p><a name=\"a7\"><\/a><br \/>\n<a name=\"a8\"><\/a><br \/>\n<a name=\"a8\"><\/a><a name=\"a8\"><\/a><\/p>\n<h3>8. Lire la s\u00e9lection d&rsquo;un UISegmentedControl<\/h3>\n<p><a name=\"a8\"><\/a><a name=\"a8\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">let selection =(sender as UISegmentedControl).selectedSegmentIndex<\/pre>\n<p><a name=\"a8\"><\/a><br \/>\n<a name=\"a9\"><\/a><br \/>\n<a name=\"a9\"><\/a><a name=\"a9\"><\/a><\/p>\n<h3>9. Libre<\/h3>\n<p><a name=\"a9\"><\/a><a name=\"a9\"><\/a><\/p>\n<pre class=\"lang:default decode:true\"><\/pre>\n<p><a name=\"a9\"><\/a> <a name=\"a10\"><\/a> <a name=\"a10\"><\/a><a name=\"a10\"><\/a><\/p>\n<h3>10. Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente<\/h3>\n<p><a name=\"a10\"><\/a><a name=\"a10\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">@IBAction func retourParent(sender: AnyObject) {\n   self.dismissViewControllerAnimated(true, completion:nil);\n}<\/pre>\n<p><a name=\"a10\"><\/a><br \/>\n<a name=\"a11\"><\/a><br \/>\n<a name=\"a11\"><\/a><a name=\"a11\"><\/a><\/p>\n<h3>11. UITableView &#8211; d\u00e9l\u00e9gation<\/h3>\n<p><a name=\"a11\"><\/a><a name=\"a11\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************************\nfunc tableView(tableView: UITableView,  numberOfRowsInSection:NSInteger) -&gt; Int\n\/\/ ********************************************************************\n{\n   return tablo.count\n} \/\/ numberOfRowsInSection\n\/\/ ********************************************************************\nfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell!\n\/\/ ********************************************************************\n{\n  \/\/variable type is inferred\n  var cell = tableView.dequeueReusableCellWithIdentifier(\"CELL\") as? UITableViewCell\n  if !cell {\n     cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: \"modeleCellule\")\n } \/\/ !cell\n  \/\/we know that cell is not empty now so we use ! to force unwrapping\n  cell!.textLabel.text = tablo[indexPath.row]\n  cell!.detailTextLabel.text = \"Personnage de Tintin\"\n  cell!.imageView.image = UIImage(named:\"lezard\")\n  return cell\n} \/\/ cellForRowAtIndexPath<\/pre>\n<p><a name=\"a11\"><\/a><br \/>\n<a name=\"a12\"><\/a><br \/>\n<a name=\"a12\"><\/a><a name=\"a12\"><\/a><\/p>\n<h3>12. Afficher une UITableViewCell perso<\/h3>\n<p><a name=\"a12\"><\/a><a name=\"a12\"><\/a><\/p>\n<pre class=\"lang:default decode:true \">\/\/ ********************************************************************\nfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell!\n\/\/ ********************************************************************\n{\n  \/\/Le type de la variable est inf\u00e9r\u00e9.\n  var cell = tableView.dequeueReusableCellWithIdentifier(\"modeleCellule\") as? CellulePerso\n  if cell !=nil {  \/\/ Si nil alors\n      cell = CellulePerso(style: UITableViewCellStyle.Value1, reuseIdentifier: \"modeleCellule\")\n  } \/\/ !cell\n  \/\/\u00c0 ce point ci, cell n'est pas nil. Il faut utiliser ! pour la d\u00e9baller\n  cell!.c1.text = tablo[indexPath.row]\n  cell!.c2.text = \"Personnage de Tintin\"\n  cell!.uneImage.image = UIImage(named:\"lezard\")\n  return cell\n} \/\/ cellForRowAtIndexPath<\/pre>\n<p><a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-857\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.03.png\" alt=\"cc-cellule.perso.03\" width=\"260\" height=\"97\" \/><\/a><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-858\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.01.png\" alt=\"cc-cellule.perso.01\" width=\"469\" height=\"75\" \/><\/a><br \/>\n<a href=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-856\" src=\"\/xcode\/wp-content\/uploads\/2014\/06\/cc-cellule.perso_.02.png\" alt=\"cc-cellule.perso.02\" width=\"248\" height=\"99\" \/><\/a><br \/>\n<a name=\"a13\"><\/a><\/p>\n<h3>13. UICollectionView &#8211; d\u00e9l\u00e9gation<\/h3>\n<p><a name=\"a13\"><\/a><a name=\"a13\"><\/a><\/p>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, numberOfItemsInSection section: Int) -&gt; Int\n\/\/ ********************************************************************\n{\n   return tablo.count\n}\n\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, cellForItemAtIndexPath indexPath: NSIndexPath?) -&gt; UICollectionViewCell?\n\/\/ ********************************************************************\n{\n  let cell = collectionView?.dequeueReusableCellWithReuseIdentifier(\"uneCellule\", forIndexPath: indexPath) as CellulePersoCV\n  \/\/ Configuration de la cellule\n  cell.c1.text = String(itemCourant)\n  cell.c2.text = String(indexPath!.row)\n  cell.c3.text = tablo[indexPath!.row]\n  return cell\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a14\"><\/a>\u00a014. Cr\u00e9er une tableau d&rsquo;images \u00e0 partir de fichiers000(i).png et animer<\/h3>\n<pre class=\"lang:default decode:true\">let DUREE_ANIMATION = 1 as NSTimeInterval\nlet ANIMATION_NB_FOIS = 3\nvar tabloImages = UIImage[]()\nfor i in 1...28 {\n  tabloImages.append(UIImage(named:\"warrior_walk_\\(i).png\"))\n}\n\/\/ Renseigner l'image \u00e0 partir du tableau et d\u00e9marrer l'animation\nuneImageAnimee.animationImages = tabloImages\nuneImageAnimee.animationRepeatCount = ANIMATION_NB_FOIS\nuneImageAnimee.animationDuration = DUREE_ANIMATION\nuneImageAnimee.startAnimating()<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a15\"><\/a>\u00a015. Cr\u00e9er une image \u00e0 partir d&rsquo;une URL<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ Cr\u00e9er un UIImage \u00e0 partir du WEB\n\/\/ Solution bloquante\n\/\/ ** Solution 1: Forme courte\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nuneImageURL.image = UIImage(data:NSData(contentsOfURL:uneURL));\n\/\/ ** Solution 2: Forme longue avec validation\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nvar err:NSError?\nlet htmlData = NSData.dataWithContentsOfURL(uneURL, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &amp;err)\nuneImageURL.image = UIImage(data:htmlData)\n\/\/ ** Solution 3 - non bloquante\nlet uneURL:NSURL = NSURL(string:\"http:\/\/hmp.me\/dtm\")\nlet request:NSURLRequest = NSURLRequest(URL:uneURL)\nlet queue:NSOperationQueue = NSOperationQueue()\nNSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -&gt; Void in\n           self.uneImageURL.image = UIImage(data:data)\n       })<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a16\"><\/a>\u00a016. Cr\u00e9er une tableau \u00e0 partir d&rsquo;un r\u00e9sultat JSON via le web<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ Obtenir la m\u00e9t\u00e9o de Montr\u00e9al via l'API Yahoo\nlet urlString = \"http:\/\/query.yahooapis.com\/v1\/public\/yql?q=select%20item%20from%20weather.forecast%20where%20location%3D%22CAXX0301%22&amp;format=json\"\nlet request:NSURLRequest = NSURLRequest(URL:NSURL(string: urlString))\nlet queue:NSOperationQueue = NSOperationQueue()\nNSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -&gt; Void in\n  var err: NSError?\n  var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &amp;err) as NSDictionary\n  if(err?) {\n     \/\/ Si erreur de conversion JSON alors afficher l'erreur\n     println(\"JSON Error (err!.localizedDescription)\")\n  }\n  println(\"===&gt; r\u00e9sultat JSON:\\n\\n \\(jsonResult)\")\n})<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a17\"><\/a>\u00a017. Pr\u00e9parer un segue<\/h3>\n<pre class=\"lang:default decode:true \">\/\/ Lanc\u00e9e automatiquement avant une transition 'segue'\n\/\/ -------------------------------------------------------------\n\/\/ Exemple pour une s\u00e9lection \u00e0 partir d'un UITableView\n\/\/ ********************************************************************\noverride func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)\n\/\/ ********************************************************************\n{\n  \/\/ Pointer sur la sc\u00e8ne de destination\n  let sceneDestination = segue.destinationViewController as ClasseSceneDestination\n  \/\/ sender -&gt; pointe sur la cellule s\u00e9lectionn\u00e9e\n  let selectionCourante = self.unTableView.indexPathForCell(sender as UITableViewCell).row;\n  \/\/ Envoyer les informations \u00e0 la sc\u00e8ne de destination\n  sceneDestination.tablo = tablo\n  sceneDestination.itemCourant = selectionCourante\n}  \/\/ prepareForSegue\n\/\/ -------------------------------------------------------------\n\/\/ Exemple pour une s\u00e9lection \u00e0 partir d'un UICollectionView\nvar _selection = 0\n\/\/ ********************************************************************\noverride func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)\n\/\/ ********************************************************************\n{\n  \/\/ Pointer sur la sc\u00e8ne de destination\n  let sceneDestination = segue.destinationViewController as Scene03\n  \/\/ indice cellule s\u00e9lectionn\u00e9e via shouldSelectItemAtIndexPath\n  let selectionCourante =  _selection;\n  \/\/ Envoyer les informations de la s\u00e9lection courante\n  sceneDestination.title = tablo[selectionCourante]\n}\n\/\/ ********************************************************************\nfunc collectionView(collectionView: UICollectionView?, shouldSelectItemAtIndexPath indexPath: NSIndexPath?) -&gt; Bool\n\/\/ ********************************************************************\n{\n  _selection = indexPath!.row\nreturn true\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a18\"><\/a>\u00a018. Ex\u00e9cuter une m\u00e9thode apr\u00e8s un d\u00e9lai<\/h3>\n<pre class=\"lang:default decode:true\">dispatch_after(temps, dispatch_get_main_queue(),\n           {\n            self.tournerLaPage(\"page2\")\n            }\n)\n\/\/ ****************************************************\nfunc tournerLaPage(scene:String) {\n        println(\"Tourner la page \u00e0 \\(scene)\")\n        performSegueWithIdentifier(scene, sender: self)\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a19\"><\/a>19. \u00a0Programmer un NSTimer<\/h3>\n<pre class=\"lang:default decode:true \">var unTimer:NSTimer!\n...\nunTimer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector(\"uneFonction:\"), userInfo: nil, repeats: true)\n...\n\/\/ *************************************\nfunc uneFonction(timer: NSTimer) -&gt; Void\n{\n   println(\"Fonction ex\u00e9cut\u00e9e par le timer...\")\n}<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a20\"><\/a>\u00a020. Afficher un Alert<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ Nouvelle m\u00e9thode propos\u00e9e avec Swift\nlet alert = UIAlertController(title: \"Title\", message: \"Message\", preferredStyle: UIAlertControllerStyle.Alert)\nalert.addAction(UIAlertAction(title: \"Button\", style: UIAlertActionStyle.Default, handler: nil))\nself.presentViewController(alert, animated: true, completion: nil)\n\/\/ Ancien m\u00e9thode inspir\u00e9e d'Objective-C\nvar alert2 = UIAlertView()\nalert2.title = \"Un titre\"\nalert2.message = \"Un message\"\nalert2.addButtonWithTitle(\"ok\")\nalert2.show()<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a21\"><\/a>\u00a021. Charger un NIB par programmation<\/h3>\n<pre class=\"lang:default decode:true\">var uneView = UINib(nibName: \"Magazine01\", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as UIView\n\/\/ Pour ajouter \u00e0 la sc\u00e8ne courante:\nview.addSubview(uneView);<\/pre>\n<p>&nbsp;<\/p>\n<h3><a name=\"a22\"><\/a>\u00a022. Animer une propri\u00e9t\u00e9<\/h3>\n<pre class=\"lang:default decode:true\">animerImage(self.uneImage)\n\/\/ ****************************************\nfunc animerObjet (objet:UIView){\n   UIView.animateWithDuration(\n             2,\n             animations: { objet.alpha = 0.5 },\n             completion: { finished in\n                           objet.hidden = false }\n   ) \/\/ UIView\n   UIView.animateWithDuration(\n             1,\n             delay:1,\n             options:UIViewAnimationOptions.CurveEaseIn,\n             animations: { objet.center.x = objet.center.x + 50},\n             completion: { _ in\n                           \/\/ Code \u00e0 ex\u00e9cuter lorsque animation termin\u00e9e\n                           \/\/ Par exemple, une autre animation.\n                         }\n    ) \/\/ UIView\n}  \/\/ animerImage<\/pre>\n<p>&nbsp;<br \/>\n&nbsp;<\/p>\n<h3><a name=\"a23\"><\/a>\u00a023. D\u00e9tecter une collision entre deux UIView<\/h3>\n<pre>CGRect personnage = [[lePersonnage.layer presentationLayer]frame];\nCGRect sousZone = CGRectInset(personnage, personnage.size.width\/2,personnage.size.height\/2 );\nif (CGRectIntersectsRect(sousZone, unObjet.frame))\n{\n  NSLog(@\"Il y a eu collision entre le personnage et %@\", unObjet.class);\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a24\"><\/a><\/p>\n<h3>24. Ins\u00e9rer une subView \u00e0 la position parentViewCount &#8211; n<\/h3>\n<pre class=\"lang:default decode:true\">view.insertSubview(uneView, atIndex: view.subviews.count - 1)<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a25\"><\/a><\/p>\n<h3>25. Obtenir l&rsquo;\u00e9l\u00e9ment d&rsquo;un dictionnaire<\/h3>\n<pre class=\"lang:default decode:true\">if let tt = jsonResult[\"query\"]![\"results\"]![\"channel\"]![\"item\"]![\"condition\"]![\"temp\"]! as String!\n{\n   println(\"Temp\u00e9rature actuelle pour Montr\u00e9al: \\(tt)\")\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a26\"><\/a><\/p>\n<h3>26. NSArray &#8211; cr\u00e9er au dur<\/h3>\n<pre class=\"lang:default decode:true\">var tablo = [\"Bob\", \"Binne\", \"Tintin\", \"Milou\", \"Hadock\", \"Castafiore\", \"Allan\", \"Tounesol\", \"Alcazar\", \"Barnab\u00e9\", \"Baxter\", \"Bill\",\"Bohlwinkel\", \"Cipa\u00e7alouvishni\"]\n\/\/ Pour ajouter un \u00e9l\u00e9ment\ntablo.append(\"Objectif Lune\")\n\/\/ Ou\ntablo+=\"encore\"\n\/\/ Pour un NSArray\nvar tabloNSArray:NSMutableArray = [\"Tintin\", \"et\", \"Milou\"]\ntabloNSArray.addObject(\"Coke en stock\")<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a27\"><\/a><\/p>\n<h3>27. NSArray &#8211; \u00e9num\u00e9ration rapide<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ \u00c9num\u00e9ration des \u00e9l\u00e9ments d'un tableau\nfor item in tablo) {\n    println(\"Item: \\(item)\")\n}\n\/\/ \u00c9num\u00e9ration des \u00e9l\u00e9ments d'un tableau avec indice\nfor (index, value) in enumerate(tablo) {\n    println(\"Item \\(index + 1): \\(value)\")\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a28\"><\/a><\/p>\n<h3>28. NSDictionnary &#8211; cr\u00e9er au dur<\/h3>\n<pre class=\"lang:default decode:true\">var dictio = [\"Nom\":\"Paul\", \"Age\":22, \"Titre\":\"Int\u00e9grateur\", \"Exp\u00e9rience\":2]\n\/\/ Ajouter un \u00e9l\u00e9ment\ndictio[\"Compagnie\"] = \"TIM\"\nvar dictio2:NSDictionary = [\"Nom\":\"Paul\", \"Age\":22, \"Titre\":\"Int\u00e9grateur\", \"Exp\u00e9rience\":2]<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a29\"><\/a><\/p>\n<h3>29. NSDictionnary\u00a0&#8211; \u00e9num\u00e9ration rapide<\/h3>\n<pre>\/\/Pour parcourir les \u00e9l\u00e9ments d'un dictionnaire\nfor(NSString * key in unDictionnaire){\n   NSLog(@\"cl\u00e9: %@, contenu: %@\", key, unDictionnaire[key]);\n}<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a30\"><\/a><\/p>\n<h3>30. Afficher heure actuelle avec format<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ ******************************************\nfunc obtenirHeure() -&gt; String {\n  let unFormateurDeDate = NSDateFormatter()\n  unFormateurDeDate.dateFormat = \"'Nous sommes 'EEEE' et il est 'hh:mm:ss\";\n  unFormateurDeDate.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n  return unFormateurDeDate.stringFromDate(NSDate())\n}  \/\/ obtenirHeure\nprintln(obtenirHeure())\n\/\/ Ou en ajoutant une nouvelle m\u00e9thode \u00e0 la Classe NSDate\nextension NSDate\n{\n    convenience\n      init(dateString:String) {\n      let dateStringFormatter = NSDateFormatter()\n      dateStringFormatter.dateFormat = \"yyyy-MM-dd\"\n      dateStringFormatter.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n      let d = dateStringFormatter.dateFromString(dateString)\n      self.init(timeInterval:0, sinceDate:d)\n    }\n }<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a31\"><\/a><\/p>\n<h3>31. Cr\u00e9er un UIButton + event par programmation<\/h3>\n<pre class=\"lang:default decode:true\">\/\/ ********************************************************\nfunc creerBouton(texte:String, action:String) -&gt; UIButton {\n  let unBouton   = UIButton.buttonWithType(UIButtonType.System) as UIButton\n  unBouton.frame = CGRectMake(100, 100, 100, 50)\n  unBouton.backgroundColor = UIColor(red: 45\/255, green: 23\/255, blue: 111\/255, alpha: 1.0)\n  unBouton.setTitle(texte, forState: UIControlState.Normal)\n  unBouton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)\n  unBouton.addTarget(self, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)\n  return unBouton\n} \/\/ creerBouton\n\/\/ ********************************************************\nfunc boutonAction(sender:UIButton!)\n{\n  println(\"Action du bouton maison!\")\n}\n\/\/ Utilisation\nself.view.addSubview(creerBouton(\"Victoire!\", action: \"boutonAction:\"))<\/pre>\n<p><a name=\"a32\"><\/a><\/p>\n<h3>32. Copier l&rsquo;\u00e9cran dans\u00a0un UIImage<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true\">\/\/ import QuartzCore\nvar imageFinale = UIImage()\nfunc sauvegarderEcran(){\n  \/\/ Description : m\u00e9thode servant \u00e0 capturer l\u2019\u00e9cran et au besoin,\n  \/\/ en faire une sauvegarde dans l\u2019album photos.\n  \/\/ 1 - Pr\u00e9parer un contexte de dessin \u00e0 partir de la taille de la sc\u00e8ne\n  UIGraphicsBeginImageContext(self.view.bounds.size);\n  \/\/ 2 \u2013 Dessiner \u00e0 partir du claque par d\u00e9faut de la sc\u00e8ne\n  self.view.layer.renderInContext(UIGraphicsGetCurrentContext());\n  \/\/ 3 \u2013 Stocker le r\u00e9sultat dans notre objet local\n  imageFinale = UIGraphicsGetImageFromCurrentImageContext();\n  \/\/ 5 \u2013 Fermer le contexte de dessin\n  UIGraphicsEndImageContext();\n  \/\/ 6 \u2013 Facultatif - Stocker une copie de la capture d\u2019\u00e9cran dans l\u2019album photos\n  UIImageWriteToSavedPhotosAlbum(imageFinale, nil, nil, nil );\n} \/\/ sauvegarderEcran<\/pre>\n<p><a name=\"a33\"><\/a><\/p>\n<h3>33. Poster vers Facebook<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true\">import Social\nfunc posterSurFacebook() {\n  \/\/ Les \u00e9tapes pour utiliser \u2018facebook\u2019\n  \/\/ 1 - Tester si le service et les informations de connexion sont dispo\n  if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook)\n  {\n    \/\/ 2 - Cr\u00e9er un feuille pour le 'post'\n    let controleur = SLComposeViewController (forServiceType: SLServiceTypeFacebook)\n    \/\/ 3 - Composer le message\n    controleur.setInitialText(\"Test avec Swift et Xcode\");\n    \/\/ 4 - Ajouter une image - facultatif\n    controleur.addImage(imageFinale);\n    \/\/ 5 - Ajouter un lien - facultatif\n    controleur.addURL(NSURL(fileURLWithPath:\"\/cours\/xcode\/\"))\n    \/\/ 6 - Pr\u00e9senter la fen\u00eatre de confirmation \u00e0 l'utilisateur\n    self.presentViewController(controleur, animated: true, completion: nil);\n    } \/\/ if Facebook\n} \/\/ posterSurFacebook<\/pre>\n<p>&nbsp;<br \/>\n<a name=\"a34\"><\/a><\/p>\n<h3>34. Poster vers twitter<\/h3>\n<pre class=\"toolbar:1 lang:default decode:true \">import Social\nfunc posterSurTwitter() {\n  \/\/ Les \u00e9tapes pour utiliser \u2018twitter\u2019\n  \/\/ 1 - Tester si le service et les informations de connexion sont dispo\n  if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter)\n  {\n    \/\/ 2 - Cr\u00e9er un feuille pour le 'post'\n    let tweetSheet = SLComposeViewController (forServiceType: SLServiceTypeTwitter)\n    \/\/ 3 - Composer le message\n    tweetSheet.setInitialText(\"TIM.CSTJ - Production sur support 2015. Intro \u00e0 Swift #CSTJ\");\n    \/\/ 4 - Ajouter une image - facultatif\n    tweetSheet.addImage(imageFinale);\n    \/\/ 5 - Ajouter un lien - facultatif\n    \/\/ [tweetSheet addURL:[NSURL URLWithString:@\"\"]];\n    \/\/ 6 - Pr\u00e9senter la fen\u00eatre de confirmation \u00e0 l'utilisateur\n    self.presentViewController(tweetSheet, animated: true, completion: nil);\n  } \/\/ if twitter disponible ...\n} \/\/ posterSurTwitter<\/pre>\n<p><a name=\"a35\"><\/a><\/p>\n<h3>35. Masquer le clavier<\/h3>\n<pre class=\"lang:swift decode:true \">\/\/ Note: il faut aussi renseigner le 'delegate' de l'objet\nfunc textFieldShouldReturn(textField:UITextField!) -&gt; Bool{\n  textField.resignFirstResponder()\n  return true\n}\n<\/pre>\n<p><a name=\"a36\"><\/a><\/p>\n<h3>36. Programmer une d\u00e9l\u00e9gation (UITextField)<\/h3>\n<pre class=\"lang:swift mark:2,8,12 decode:true\">import UIKit\nclass ViewController: UIViewController, UITextFieldDelegate  {\n    @IBOutlet weak var unChamp: UITextField!\n    var nbRetours = 0\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        unChamp.delegate = self\n    }  \/\/ viewDidLoad\n    \/\/\/ Programmer une d\u00e9l\u00e9gation\n    func textFieldShouldReturn(textField: UITextField!) -&gt; Bool  {\n        println(\"La touche 'Return' a \u00e9t\u00e9 appuy\u00e9e \\(++nbRetours) fois.\")\n        return true\n    } \/\/textFieldShouldReturn\n}  \/\/ ViewController\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>37. Ajouter la gestion des versions \u00e0 un projet existant<\/h3>\n<pre class=\"lang:swift decode:true \"># \u00c0 partir de l'app 'terminal', naviguer vers le dossier parent du projet et saisir les commandes suivantes:\ngit init\ngit add .\ngit commit -m \"Premier 'Commit'\"\n<\/pre>\n<h3><\/h3>\n<h3>38. Stub AppDelegate.swift pour Xcode 6.4<\/h3>\n<pre class=\"lang:swift decode:true \">\/\/  AppDelegate.swift\n\/\/  stub\nimport UIKit\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n    var window: UIWindow?\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -&gt; Bool {\n        return true\n    } \/\/ didFinishLaunchingWithOptions\n    func applicationWillResignActive(application: UIApplication)    {  }\n    func applicationDidEnterBackground(application: UIApplication)  {  }\n    func applicationWillEnterForeground(application: UIApplication) {  }\n    func applicationDidBecomeActive(application: UIApplication)     {  }\n    func applicationWillTerminate(application: UIApplication)       {  }\n} \/\/ class AppDelegate:<\/pre>\n<h3><\/h3>\n<h3>39. Git \u00e0 partir du terminal (pour le travail d&rsquo;\u00e9quipe)<\/h3>\n<pre class=\"lang:swift decode:true \">\u00c9tapes:\n1 - Creer un 'repo' sur github avec un Readme et ignore 'swift'\n2 - Creer le projet sous Xcode avec l'option 'git'\n3 - Avec terminal, cd vers le dossier du projet taper:\n  git init\n  git remote add origin https:\/\/github.com\/votre compte\/le projet.git\n  git pull origin master\n  git add *\n  git commit -m \"commit de depart\"\n4 - dand Xcode, faire un push\n\/\/ Pour le deuxieme membre de l'\u00e9quipe faire:\nSource control -&gt; check out\n\/\/ gestion des conflits\nhttp:\/\/roadfiresoftware.com\/2015\/09\/automatically-resolving-git-merge-conflicts-in-xcodes-project-pbxproj\/<\/pre>\n<h3>40. Variables globales<\/h3>\n<p>Ajouter une classe ou une structure au projet qui contient des propri\u00e9t\u00e9s statiques:<\/p>\n<pre class=\"lang:swift decode:true \">\/\/ Fichier Static.swift\nstruct Static {\n    static var i = 99\n}\n\/\/\/  Exemple d'utilisation:\noverride func viewDidAppear(animated: Bool) {\n    Static.i = 123\n    println(Static.i)\n}\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contenu Afficher une trace Cha\u00eene de caract\u00e8res Cha\u00eene de caract\u00e8res avec interpolation Cha\u00eene &#8211; concat\u00e9nation Cr\u00e9er un tableau \u00e0 partir d&rsquo;un fichier de propri\u00e9t\u00e9s Charger une image par programmation Cacher la barre d&rsquo;\u00e9tat (haut de l&rsquo;\u00e9cran) Lire la s\u00e9lection d&rsquo;un UISegmentedControl Libre Revenir \u00e0 la sc\u00e8ne pr\u00e9c\u00e9dente UITableView &#8211; d\u00e9l\u00e9gation Afficher une UITableViewCell perso UICollectionView [&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-829","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/829","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=829"}],"version-history":[{"count":0,"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/pages\/829\/revisions"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/xcode\/wp-json\/wp\/v2\/media?parent=829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}