Je veux créer un composant réutilisable (un contrôle personnalisé) pour l'iPhone. Il s'agit de plusieurs contrôles standards prédisposés sur une vue, puis d'un code associé. Mes objectifs sont les suivants :
- Je veux pouvoir utiliser Interface Builder pour mettre en page les sous-vues de mon contrôle personnalisé ;
- Je veux d'une manière ou d'une autre emballer le tout de sorte que je puisse ensuite assez facilement glisser et déposer le composant personnalisé résultant dans d'autres vues, sans avoir à recâbler manuellement un tas de prises et ainsi de suite. (Un peu de recâblage manuel, ça va, mais je ne veux pas en faire des tonnes et des tonnes).
Permettez-moi d'être plus concret, et de vous dire précisément ce que mon contrôle est censé faire. Dans mon application, j'ai parfois besoin d'appeler un service web pour valider les données que l'utilisateur a saisies. En attendant une réponse du service web, je veux afficher un spinner (un indicateur d'activité). Si le service web répond avec un code de réussite, je veux afficher une coche "réussite". Si le service Web répond par un code d'erreur, je veux afficher une icône d'erreur et un message d'erreur.
La méthode à usage unique est assez simple : je crée simplement une UIView qui contient une UIActivityIndicatorView, deux UIImages (une pour l'icône de réussite et une pour l'icône d'erreur), et une UILabel pour le message d'erreur. Voici une capture d'écran, avec les parties pertinentes marquées en rouge :
Je connecte ensuite les pièces aux prises, et je mets du code dans mon contrôleur.
Mais comment emballer ces éléments - le code et la petite collection de vues - afin de pouvoir les réutiliser ? Voici quelques solutions que j'ai trouvées et qui me permettent d'y arriver, mais qui ne sont pas si géniales :
- Je peux faire glisser la collection de vues et de contrôles dans la section Objets personnalisés de la bibliothèque ; puis, plus tard, je peux les faire glisser à nouveau sur d'autres vues. Mais (a) cela oublie quelles images étaient associées aux deux UIImages, (b) il y a beaucoup de recâblage manuel de quatre ou cinq prises, et (c) surtout, cela n'apporte pas le code. (Il y a peut-être un moyen facile de câbler le code).
- Je pense que je pourrais créer un IBPlugin ; je ne suis pas sûr que cela soit utile, et cela semble représenter beaucoup de travail. De plus, je ne sais pas vraiment si les IBPlugins fonctionnent pour le développement de l'iPhone.
- Je me suis dit : "Hmm, il y a du code associé à cela - ça sent le contrôleur", alors j'ai essayé de créer un contrôleur personnalisé (par ex.
WebServiceValidatorController
) avec le fichier XIB associé. Cela semble vraiment prometteur, mais à ce moment-là, je n'arrive pas à trouver comment, dans Interface Builder, faire glisser ce composant sur d'autres vues. Le siteWebServiceValidatorController
est un contrôleur et non une vue. Je peux donc le faire glisser dans une fenêtre de document, mais pas dans une vue.
J'ai l'impression que je rate quelque chose d'évident...