Xcode 4 et l'éditeur Assistant

NeofelisNeofelis Membre
15:54 modifié dans Xcode et Developer Tools #1
Bonjour,

Utilisez-vous l'éditeur Assistant dans Xcode 4 ? Pour le moment je ne m'en servais pas mais je viens de découvrir qu'il était par exemple possible de créer des Outlets ou des Actions directement en maintenant CTRL + glisser déposer dans la fenêtre de code !

Par contre petite question : Dans une application test j'ai créé une Outlet dans une vue (donc une classe héritée de NSView) manuellement. Je voulais donc recommencer en utilisant le drag and drop directement dans le code mais pour une raison que j'ignore Xcode ne me popose pas de créer une Outlet dans le header de ma vue, par contre cela marche lorsque j'essaye dans le fichier (monProjet)AppDelegate.h...

Quelqu'un aurait une explication ? (Si vous avez besoin de plus de détail pour comprendre mon problème faites-le moi savoir).

Merci

Réponses

  • laudemalaudema Membre
    15:54 modifié #2
    Parce qu'elle n'est pas référencé / connue du .xib. Je m'explique mal mais si tu ajoutes un objet standard dans ton xib et que tu lui donnes ta classe comme classe dans le panneau identity alors tu pourrais mettre un outlet.. Ou tu peux virer ton objet appDelegate et tu verras que même si tu as sa classe dans l'assistant tu ne peux plus lui ajouter d'outlets..
  • NeofelisNeofelis Membre
    15:54 modifié #3
    dans 1307298901:

    Parce qu'elle n'est pas référencé / connue du .xib. Je m'explique mal mais si tu ajoutes un objet standard dans ton xib et que tu lui donnes ta classe comme classe dans le panneau identity alors tu pourrais mettre un outlet.. Ou tu peux virer ton objet appDelegate et tu verras que même si tu as sa classe dans l'assistant tu ne peux plus lui ajouter d'outlets..


    Oui ok il fallait ajouter un NSObject (le cube bleu) et lui mettre la classe de ma vue, ensuite ça fonctionne merci ;)

    Par contre si je peux ajouter un outlet, j'ai l'impression que la connexion ne se fait pas correctement. Je détaille mon cas.

    A gauche j'ai mon xib et à  droite le .h de ma classe de vue (appelons là  "myView").

    Dans mon xib j'ai une checkbox et une vue, je souhaite donc ajouter un outlet référençant ma checkbox dans ma vue.

    Pour ce faire, je drag ma checkbox dans l'interface de ma vue qui créé une variable d'instance IBOutlet NSButton (que j'appelle "myCheckbox" disons). Je clique sur "Connect" pour valider.

    Là  je retourne sur mon xib, je fais un clic droit sur ma checkbox : je vois bien dans "Referencing Outlets" la connexion "MyCheckbox <=> MyView". Jusque là  tout va bien, ensuite je regarde sur "MyView" toujours dans mon xib, clic droit et je vois l'outlet "MyCheckbox" non connecté. C'est ce que je ne comprends pas...
  • laudemalaudema Membre
    juin 2011 modifié #4
    Parce que, maintenant, tu as deux instances de MaView (mettons lui une majuscule elle aura l'air plus [tt]Classe[/tt] :).
    Une dans la fenêtre et une autre, au Top Niveau ( = à  côté de la fenêtre), qui seront chargées toutes les deux quand le .xib sera desarchivé.

    Si tu veux connecter un outlet à  ta MaView *maView de la fenêtre tu dois partir de maView pour conclure dans myCheckBox. A l'ancienne :)
    Enlève l'objet générique du xib pour y voir plus clair: tu ne pourras plus faire ta connexion dans le .h !
    De toutes façons il n' était là  que pour un "tourne autour" de la création d'un IBOutlet dans une classe sans avoir à  entrer soi même le code : un clic droit sur maView te montre que tu as réussi ..
  • NeofelisNeofelis Membre
    juin 2011 modifié #5
    J'ai du mal à  comprendre ton dernier post :s

    Je ne comprends pas pourquoi tu dis par exemple que j'ai 2 instances de MyView, moi je n'en vois qu'une...

    EDIT : je crois que je viens de comprendre, j'ai 2 instances parce que j'ai ajouté une vue manuellement (le cube bleu) en plus de celle que j'ai dans mon interface...
  • CéroceCéroce Membre, Modérateur
    15:54 modifié #6
    dans 1307305095:

    Dans mon xib j'ai une checkbox et une vue, je souhaite donc ajouter un outlet référençant ma checkbox dans ma vue.

    As-tu déjà  entendu parlé du MVC ?
  • NeofelisNeofelis Membre
    15:54 modifié #7
    Oui ?
  • CéroceCéroce Membre, Modérateur
    15:54 modifié #8
    Imaginons un logiciel qui manipule des formes géométriques. On peut régler l'épaisseur du trait. Typiquement, on va disposer d'un NSSlider et d'un NSTextField pour régler cette épaisseur. Quand le slider est glissé, le Contrôleur modifie l'épaisseur dans le Modèle, relit la valeur dans le modèle, et l'affiche dans le text field. Quand des chiffres sont saisis dans le textfield, le Contrôleur prend le texte, le convertit en nombre et l'affecte à  l'épaisseur dans le modèle, puis donne cette valeur au slider.
    Note qu'il faut 1) donner la valeur dans au modèle puis 2) la relire pour permettre la validation de la valeur.

    Où je veux en venir est que par ce principe, seuls les Contrôleurs possèdent des outlets.

    Revenons à  ton cas. Si par exemple ta vue FlowersView sert à  afficher des fleurs, et que tu as une checkbox "Afficher les fleurs bleues", alors FlowersView ne doit pas posséder une outlet vers la checkbox, mais le contrôleur doit avoir une outlet sur la FlowersView et recevoir l'action de la checkbox et modifier 1) le modèle qui possède une propriété "Fleurs bleues visibles" et 2) la propriété "Fleurs bleues visibles" de FlowersView. 
  • NeofelisNeofelis Membre
    15:54 modifié #9
    Merci Céroce pour l'explication ;)
  • NeofelisNeofelis Membre
    15:54 modifié #10
    Du coup c'est valable aussi pour les méthodes d'actions non ? Parce que j'étais justement sur un exemple dans le livre d'Aaron Hillegass où il met des méthodes d'action dans la vue (je peux uploader l'exemple au besoin)...

    Exemple d'un fichier h de l'appli en question :

    <br />//<br />//&nbsp; BigLetterView.h<br />//&nbsp; TypingTutor<br />//<br />//&nbsp; Created by Aaron Hillegass on 10/19/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface BigLetterView : NSView {<br />	NSColor *bgColor;<br />	NSString *string;<br />	NSMutableDictionary *attributes;<br />}<br />- (IBAction)savePDF:(id)sender;<br /><br />@property (assign, readwrite) NSColor *bgColor;<br />@property (copy, readwrite) NSString *string;<br /><br />@end<br /><br />
    


    Qu'en pensez-vous ?
  • CéroceCéroce Membre, Modérateur
    15:54 modifié #11
    Bien vu !

    Dans l'exemple de Hillegass, il a clairement fait cela pour permettre de connecter directement un article de menu. Ceci dit, il prend à  mon sens un raccourci de conception: certes ce sont les vues qui dessinent dans un contexte graphique PDF, mais enregistrer les données n'est absolument pas de leur ressort. Le livre d'Hillegass est très bien, mais il ne donne pas toujours de bons exemples en termes d'architecture, ne serait-ce que par soucis de concision.

    Il y a au moins une raison qui justifie les actions sur les vues: NSView hérite de NSResponder. Sans entrer dans les détails de la chaà®ne des répondeurs, c'est ce mécanisme qui permet de faire en sorte que lorsqu'on sélectionne l'article de menu Copier, la commande opère sur la sélection courante. L'article Copier n'ayant pas de cible (nul-targeted action), la chaà®ne des répondeurs va être parcourue jusqu'à  trouver un répondeur répondant à  l'action copy:. C'est ce qui permet à  NSTextField de copier directement son contenu dans le Presse-Papier sans intervention du contrôleur (si je ne me trompe pas).
  • laudemalaudema Membre
    15:54 modifié #12
    NextKeyView lui ne doit donc son existence qu'à  la nécessité qu'il soit présent dans chaque vue quand on est dans IB, permettant de construire aisément le "chemin de saisie" ?
    Mais que penser de l'outlet menu incorporé à  chaque NSView ?
    Ce n'est pas si répandu qu'on doive pouvoir en disposer partout, une propriété ferait aussi bien l'affaire, surtout avec les bindings qu'on a maintenant..
    Une relique de l'ancien temps destinée à  être bientôt marquée deprecated ?
Connectez-vous ou Inscrivez-vous pour répondre.