IBOutlet et héritage...
vincepoencet
Membre
Bonjour !
Y a t'il un moyen de faire reconnaitre par IB les IBOutlets d'une classe parent dans une classe héritée ?
ex :
class A
{
IBOutlet toto;
}
class B : A
{
IBOutlet titi;
}
Si j'utilise la classe B comme controller, IB trouve titi mais pas toto via le control-drag, on peut y faire quelque chose ?
Y a t'il un moyen de faire reconnaitre par IB les IBOutlets d'une classe parent dans une classe héritée ?
ex :
class A
{
IBOutlet toto;
}
class B : A
{
IBOutlet titi;
}
Si j'utilise la classe B comme controller, IB trouve titi mais pas toto via le control-drag, on peut y faire quelque chose ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Du moins si tu n'as pas d'erreur de syntaxe (compile ton projet pour vérifier par exemple)
Genre, t'as pas oublié de faire un #import A dans ton B.h ?
Bizarre, je retesterait ça ce soir
Tu as bien fait :
Ben oui, quand on sous-classe une classe standard, un NSTextField par exemple, IB continue de proposer (au moins) les mêmes IBOutlet.
Au cas où tu aurais donc mis ça hors du @interface...@end (à priori non mais bon comme Louka le fait remarquer et vu que tu n'as pas mis le code exact dans ton premier post mais juste le concept...) ou surtout au cas où tu aurais mis ces définitions dans un .m (pour une raison obscure) :P
Subsidiary question: quelle version pour IB ?
Avec la 3.2 il faut remonter l'arborescence de la classe dans le panneau Library pour voir les outlets associès à chaque niveau. Ce que je trouve moins pratique qu'avant quand ils étaient tous dans l'inspecteur, onglet identity (de mémoire). On ne les voit plus que dans FileOwner onglet Attributes.
Par contre cet IB là renoue un peu avec l'ancienne méthode du temps de Project Builder ou l'on pouvait commencer en créant un projet puis passer direct dans IB dessiner l'interface et crééer ses classes (avec Outlets et Actions) en sous-classant une classe déjà connue (NSOBject, NSView, NSYouNameItAlreadyInAppKit...) puis les écrire dans le projet pour ensuite les retravailler dans le code.
Moi je suis en IB 3.2 pour ma part, et si je sélectionnes dans mon XIB un objet de type MaClasse, où MaClasse est une classe de mon projet héritant (d'après le .h) disons de UIViewController, alors je vois à la fois les IBOutlets de UIViewController (view, searchDisplayController) et de MaClasse (ceux définis moi-même dans le .h). Et ce à la fois dans le panneau "Connections Inspector" que si je fais Ctrl+clic sur l'objet (et de même si je fais Ctrl+clic+drag vers un objet de type A, j'ai bien tous les IBOutlets de type A qui me sont proposés, qu'ils viennent de UIViewController ou de MaClasse)
Je n'ai pas vu de notion de hiérarchie des IBOutlets dans IB.
Par contre je n'ai pas l'onglet où l'on peut, depuis IB, rajouter ses IBActions et IBOutlets. Mais j'y pense, c'est parce que j'utilise dernièrement IB uniquement sur des projets iPhone (où les palettes ne sont pas tout à fait les mêmes), faudrait que je regarde sur un projet Mac...?
La seule chose impossible est de définir la super-classe. Mais dans le .h généré par IB, on trouve: :P Donc il suffit de faire ce qu'indique IB et tout baigne!
C'est pas dans cette même palette / ce même onglet qu'on pouvait avant (IB 3.1 ?) rajouter des IBActions et des IBOutlets directement dans InterfaceBuilder ? (et ensuite faire "Write Class Files..." dans le menu File pour générer les .h et .m qui vont bien avec ces nouveaux IBActions/IBOutlets ?)
Par contre, vu les questions, l'ergonomie ne parait pas s'être améliorée!
Bah par contre si, ça reste logique :
1) Si tu crées ta propre classe, et que tu veux ajouter des IBOutlets et IBActions à cette classe, tu peux donc en effet passer par la palette que Philippe a mis en copie. Ca ajoutera ces Outlets/Actions qu'à ladite classe, bien sûr, pas aux classes parentes, mais ça c'est normal (et a toujours été comme ça, y compris dans IB 3.1 quand on avait la possibilité d'ajouter ces Outlets/Actions à un autre endroit dans IB)
2) Si tu veux voir tous les Outlets d'un objet, il suffit de sélectionner l'objet dans ton projet IB, et regarder dans l'Inspecteur "Connections" qui te liste tous les Outlets et toutes les Actions, locales ou héritées, et te permet directement de les connecter ou voir celles qui sont déjà connectées.
Donc si tu veux voir les outlets d'une classe donnée, et en ajouter depuis IB, Library > Classes.
Si tu veux voir les outlets d'un objet donné, Inspecteur "Connections".
Il fallait effectivement chercher un peu et ce n'était pas simple, quelque chose qui restait là pour les nostalgiques ou les habitués à l'ancienne manière de faire qui était donc, d'après le livre qu'Apple recommandait http://oreilly.com/catalog/9780596003012/preview de créer un projet puis de passer dans IB pour en définir les classes et l'interface utilisateur et enfin les faire écrire dans ton projet.
Puis Apple a changé sa manière de faire et il faut désormais définir les classes, leurs outlets, leurs actions, dans Xcode, IB ne sert plus qu'à agencer l'UI.
Avec les classes déportées dans la librairie on revient plus facilement à l'ancienne manière. Surtout avec le Pop Up "Actions" en bas du panneau.
Mais on n'a plus un endroit où voir et créer toutes les actions d'un objet
On peut tout voir dans l'onglet Connections de l'inspecteur mais on ne peut plus créer que dans l'onglet Classes de la Librairie..
Le meilleur des deux mondes ?
Seules les classes possèdent des actions. C'était d'ailleurs toute l'ambiguité de la présentation précédente qui pouvait laisser penser que l'on créait une action pour une instance, alors que l'action était créée pour la classe. Donc c'est plus que précédemment.
Je vous jure, ou vont se nicher les associations d'idée!
Donc autant pour moi et merci à tout le monde