IBOutlet et héritage...

vincepoencetvincepoencet Membre
septembre 2009 modifié dans API AppKit #1
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 ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #2
    C'est pas normal, il devrait le découvrir tout seul.
    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 ?
  • vincepoencetvincepoencet Membre
    20:58 modifié #3
    Oui j'ai bien fait l'import, et pas d'erreur de compilation...
    Bizarre, je retesterait ça ce soir
  • septembre 2009 modifié #4
    C'est vrai que c'est bizarre  :o
    Tu as bien fait :
    <br />@interface classB : classA<br />{<br /> IBOutlet titi; <br />}<br />
    
  • Philippe49Philippe49 Membre
    20:58 modifié #5
    dans 1253871803:

    C'est pas normal, il devrait le découvrir tout seul.


    Ben oui, quand on sous-classe une classe standard, un NSTextField par exemple, IB continue de proposer (au moins) les mêmes IBOutlet.
  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #6
    Et petite note, InterfaceBuilder ne scanne que les .h à  la recherche des mots clés IBOutlet et IBAction à  l'intérieur des @interface...@end

    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
  • laudemalaudema Membre
    20:58 modifié #7
    Bonjour,

    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.

  • tabliertablier Membre
    20:58 modifié #8
    Par contre cet IB là  renoue un peu avec l'ancienne méthode du temps de .... etc
    Il me semble que cela existait encore dans IB 2.5, IB 3.0..... etc. D'accord, il fallait chercher un peu et ce n'était pas le plus simple, mais il me semble bien que c'était faisable.
  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #9
    Heu j'avoue que je capte pas trop ce que vous racontez, là .

    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...?
  • tabliertablier Membre
    20:58 modifié #10
    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...?
    Ben, .... j'ai pas le 3.2!! Mais avec le 3.1.2 sur Mac, j'ai tout les onglets nécessaires pour nommé la classe, ajouter des IBActions et des IBOutlets puis sauver les fichiers .m et .h dans le projet.
    La seule chose impossible est de définir la super-classe. Mais dans le .h généré par IB, on trouve:
    @interface MaClasse : /* Specify a superclass (eg: NSObject or NSView)*/
      :P Donc il suffit de faire ce qu'indique IB et tout baigne!
  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #11
    Voilà  ce à  quoi ressemble la palette "Identity Inspector" sous IB 3.2 (projet MacOS X, mais sous un projet iPhone cet onglet de la palette a la même tête)

    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 ?)
  • Philippe49Philippe49 Membre
    20:58 modifié #12
    [move] :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking: :p :kicking:[/move]
  • tabliertablier Membre
    20:58 modifié #13
    D'après ce qu'a posté Philippe, tout existe dans IB 3.2.!!
    Par contre, vu les questions, l'ergonomie ne parait pas s'être améliorée!
       
  • AliGatorAliGator Membre, Modérateur
    20:58 modifié #14
    Wow c'est énorme cet onglet "Classes" dans la palette Library, j'avais jamais fait gaffe :-)

    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".
  • laudemalaudema Membre
    20:58 modifié #15
    Il me semble que cela existait encore dans IB 2.5, IB 3.0..... etc. D'accord, il fallait chercher un peu et ce n'était pas le plus simple, mais il me semble bien que c'était faisable.

    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 ?

  • Philippe49Philippe49 Membre
    20:58 modifié #16
    dans 1253934028:

    Mais on n'a plus un endroit où voir et créer toutes les actions d'un objet

    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.
  • tabliertablier Membre
    septembre 2009 modifié #17
      :P
    Le meilleur des (deux) mondes ?
    Aldous Huxley bien sur!!
    Je vous jure, ou vont se nicher les associations d'idée!
  • vincepoencetvincepoencet Membre
    20:58 modifié #18
    Bon j'ai pas retrouver le code qui marchait pas, j'ai refait un test et bien évidemment c'est tout bon...

    Donc autant pour moi et merci à  tout le monde :p
Connectez-vous ou Inscrivez-vous pour répondre.