I  Swift

Not a surprise, Swift is very different from Objective-C,  knowledge of Cocoa and Cocoa Touch APIs helps a lot to skip the struggle coming from iOS and is a real plus in learning.

Convertir un XIB iPhone en un XIB iPad

Problème rencontré dans une application universelle, car nos XIB sont générés à partir de templates, et forcé à utiliser un layout iPhone.

Le layout sélectionné a une importance, notamment dans l’affichage des images. Si le projet comporte des images avec les modifiers, nous cherchons toujours à afficher les images en fonction du device (ex: background.png et background~ipad.png)

Pour cela rien de compliquer:
1) ouvrir le xib en mode texte
2) modifier le contenu de la ligne 2 en remplacant
[cc lang=”xml”]

[/cc]
par
[cc lang=”xml”]

[/cc]
3) de retour en mode Interface Builder, il faudra éventuellement modifier les Simulated Metrics pour obtenir un résultats cohérent, mais les images sont lues correctement

dotfiles

Découverts récemment lors d’une formation, les dotfiles sont géniaux !

Il s’agit de partager via git (ça pourrait marcher avec n’importe quel autre gestionnaire de versions) la configuration de son ordinateur de façon à pouvoir ré-installer simplement son environnement de travail. Nommés dotfiles en références à tout ces petits fichiers cachés commençant par un . sur les systèmes à la UNIX, il est vraiment intéressant de les mettre en forme pour les partager, et ce pour diverses raisons:

  • Sauvegarder & restaurer sa configuration: lorsqu’on change ou formate sa machine, c’est quand même pratique de ne pas avoir à tout reconfigurer, en particulier tout ces petits réglages qui rendent l’utilisation du terminal efficace
  • Apprendre des autres: en naviguant parmi les nombreuses configurations d’autres power users qui les partagent eux aussi, c’est l’occasion de découvrir de nouveaux outils et de nouvelles pratiques

J’ai donc décider de moi aussi partager mes dotfiles sur GitHub.

L’explication des dotfiles, directement par GitHub: http://dotfiles.github.io/

#pragma mark

Les #pragma sont des directives pré-processeur, qui sont évaluées lors de la compilation du code en Objective-C, et qui contrairement aux directives #ifdef / #endif ne changeront pas le comportement de l’application au runtime.

Les directives #pragma sont simplement évaluées, et donc utilisées, par Xcode. On les utilise pour deux raisons:

  • Organiser le code
  • Rendre les warning silencieux

Organiser le code avec les #pragma mark

Les directives #pragma mark permettent donc d’organiser le code en permettant le regroupement de différentes méthodes par groupe.

Elles sont insérées dans l’implémentation des classes (fichiers .m) entre chaque groupe de méthodes comme suit:

[cc lang=”objc”]
@implementation ListViewController

#pragma mark – Constructor
– (id)init
{
if (self = [super initWithNibName:@”ContactListViewController” bundle:nil])
{
[…]
}

return self;
}

#pragma mark – View management
– (void)viewDidLoad
{
[super viewDidLoad];

}

#pragma mark – UITableViewDataSource methods
– (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
[…]
}

– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[…]
}

#pragma mark – UITableViewDelegate methods
– (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[…]
}

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[…]
}

#pragma mark – NSFetchedResultsControllerDelegate methods
– (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[…]
}

#pragma mark – Memory
– (void)dealloc
{
[…]
}

@end
[/cc]

A noter qu’ajouter un tiret entre les mots clés #pragma mark et le titre du groupe permet d’avoir un séparateur dans l’inspecteur de méthodes:

pragma

Bonne pratique

Une bonne pratique est de mettre en place *sans modération* lors de l’utilisation de protocoles est de commencer le titre du groupe par le nom exact du protocole.

[cc lang=”objc”]
// Mauvaise pratique

#prama mark – Table view data source methods
– (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { … }

// Bonne pratique

#pragma mark – UITableViewDataSource methods
– (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { … }
[/cc]

Cela permet notamment d’accéder rapidement à la déclaration du protocole en appuyant grâce au “cmd + click” sur le titre.