Insérer une vue de type inconnu dans l'interface

AliGatorAliGator Membre, Modérateur
10:33 modifié dans API AppKit #1
Bonjour à  tous <3 <br />
Voilà  j'ai une petite problématique à  vous soumettre. J'ai une interface dans laquelle je souhaite intégrer une SFAuthorizationView (laquelle contiendrait ensuite divers éléments évidemment).
  • Soit je la crée par code, ça marche mais c'est un peu lourd surtout s'il faut ensuite créer tout le contenu à  la main.
  • Si je place une "custom view" (enfin une NSView quoi) dans mon interface sous IB et que je change ensuite sa classe en SFAuthorizationView dans IB, au chargement du NIB quand je run il me met un message dans le log comme quoi il ne connaà®t pas ce type et donc ne peut instancier l'objet (ça se comprend en somme)
  • Soit je place une custom view dans mon interface, et par code je la "wrappe" dans une SFAuthorizationView. C'est à  dire que je crée une SFAuthorizationView par code, j'enlève ma customview de sa superview et je l'ajoute à  cette SFAuthorizationView à  la place. En ajustant les frames de ces vues. Ca marche mais il faudrait alors ajuster/copier tous les attributs aussi : les masques pour le resizing, etc... bref toutes ces propriétés qu'on règle dans IB !
  • A moins qu'il y ait finalement un moyen, au lieu de "wrapper" ma customview dans une nouvelle SFAuthorizationView,  de faire transformer cette customview en SFAuthorizationView... changer sa classe dynamiquement quoi... ? Mouais.
  • La dernière solution, la plus propre à  mon avis et celle qui devrait venir en premier à  l'esprit, est de créer une classe MyAuthorizationView, sous-classe de SFAuthorizationView (et donc aussi de NSView), tout comme on crée une custom view classiquement quoi. Et de régler notre custom view dans IB pour qu'elle utilise cette classe. Classique... mais ça nécessite de créer une sous-classe de SFAuthorizationView... pour rien (pas d'ajout de méthode ni de variable d'instance), du coup je trouve ça un peu bête, non ?


Voilà , quelle est votre suggestion de ce côté ? La solution la plus propre est simple que je vois pour l'instant c'est sous-classer SFAuthorizationView comme on créerait une customview, mais si on pouvait l'utiliser directement sans même sous-classer, ça serait vraiment mieux non ?
Et sinon, comment on peut placer sur l'interface dans IB un objet graphique venant d'un autre framework (ici SecurityInterface.framework) sans qu'il gueule ensuite au chargement du NIB ?

Réponses

  • schlumschlum Membre
    10:33 modifié #2
    dans 1226513212:

    • Si je place une "custom view" (enfin une NSView quoi) dans mon interface sous IB et que je change ensuite sa classe en SFAuthorizationView dans IB, au chargement du NIB quand je run il me met un message dans le log comme quoi il ne connaà®t pas ce type et donc ne peut instancier l'objet (ça se comprend en somme)



    Non, ça ne se comprend pas... Je l'ai déjà  fait plusieurs fois, ça fonctionne très bien  ???
    Il faut juste glisser le header de cette view sur IB au préalable...
  • schlumschlum Membre
    10:33 modifié #3
    Par contre, attention, il y a plusieurs choses à  faire dans le "awakeFromNib" pour que ça fonctionne correctement :
    http://developer.apple.com/documentation/Security/Reference/SecurityInterfaceFramework/Classes/SFAuthorizationView_Class/Reference/Reference.html

    When you add an authorization view as a custom view to a window or dialog box, you must initialize it before it displays correctly. To initialize the view, use the setString: method to create a default rights structure (containing a prompt string) or the setAuthorizationRights: method to specify a rights structure. You must also either specify automatic updates (setAutoupdate: or setAutoupdate:interval:) or perform a manual update (updateStatus:) to set the lock icon to its initial state.
  • AliGatorAliGator Membre, Modérateur
    novembre 2008 modifié #4
    dans 1226525356:

    Par contre, attention, il y a plusieurs choses à  faire dans le "awakeFromNib" pour que ça fonctionne correctement :
    http://developer.apple.com/documentation/Security/Reference/SecurityInterfaceFramework/Classes/SFAuthorizationView_Class/Reference/Reference.html
    Merci pour la ref... mais y'a pas de problèmes de ce côté, j'ai réussi à  afficher ma vue nickel depuis un bail, depuis le temps que je potasse les docs sur les AuthorizationsServices, AuthentificationsServices, SFAuthorization, SFAuthorizationView & co... j'en ai bouffé un peu  :)

    Ma vue s'affiche nickel, quelle que soit la méthode (sous-classe perso de SFAuthorizationView, NSView classique wrappée en SFAuthorizationView par le code, etc) que j'emploie... j'ai bien pensé à  faire le setString et tout marche comme je veux, pas de soucis :)

    ...à  part....
    à  part pour le cas où je met directement dans IB que la custom view est une SFAuthorizationView : là  j'ai la fameuse erreur lorsque j'exécute mon projet que c'est un objet inconnu (car il n'a pas connaissance du .h).
    Pourtant j'ai inclus le SecurityInterface.framework (qui contient SFAuthorizationView.h dans son dossier "Headers") dans mon projet dans Xcode. Et comme avec les custom view habituelles (quand on sous-classe nous-même NSView dans notre projet) j'ai jamais eu ce problème et jamais eu à  déposer le .h correspondant dans IB...
    ...et que c'est la première fois que je souhaite utiliser une NSView issue d'un framework particulier (et d'un type qui n'est pas déjà  dans la palette de librairie de IB)...


    Bon au final j'ai fini par sous-classer en MyAuthorizationView car c'était pas plus mal ça me permet de gérer 2-3 conneries dedans en plus.
    Mais j'ai essayé ta méthode, juste pour me coucher moins c*n ce soir :)
    En effet une fois que j'ai glissé le .h dans la fenêtre principale de IB (MainMenu.xib pour mon cas), si je définis ma custom view dans IB comme étant SFAuthorizationView non seulement il me le propose maintenant dans le drowdown menu, mais en plus il veut bien me la créer.

    Merci pour l'astuce ;)
  • laurrislaurris Membre
    10:33 modifié #5
    dans 1226534882:


    En effet une fois que j'ai glissé le .h dans la fenêtre principale de IB (MainMenu.xib pour mon cas), si je définis ma custom view dans IB comme étant SFAuthorizationView non seulement il me le propose maintenant dans le drowdown menu, mais en plus il veut bien me la créer.

    Merci pour l'astuce ;)


    Normalement, dans IB 3 (Leopard), quand IB est syncro avec le projet Xcode (diode verte en bas de la fenêtre), le header est lu automagiquement et pas besoin de l'ajouter à  la main comme dans IB2. Non ?
  • AliGatorAliGator Membre, Modérateur
    10:33 modifié #6
    Ben comme je disais, c'est ce que je pensais aussi... mais ça n'a pas l'air pour ce qui est des frameworks

    Pour ce qui des classes persos (genre dans Xcode tu fais File -> New File et tu crées une "Objective-C NSView subclass" disons MyView.h/.m histoire de te faire une custom view dans les règles... ben si tu retournes dans IB, et que tu ajoutes une NSView dans l'interface puis modifie (dans l'identity inspector) sa classe en "MyView", là  pas de soucis, ça marche.

    Depuis IB3 je fais souvent comme ça (plutôt que d'indiquer le nom de ma future classe dans la NSView placée dans IB puis de demander "Write Class Files...") et ça ne m'a jamais causé de soucis.

    MAIS ici il s'agit non pas d'une sous-classe que j'ai créé moi-même, mais d'une classe définie dans un Framework (SecurityInterface.framework dans mon cas). Et j'ai beau avoir ajouté ce framework dans mon projet, et dans le group "Linked Frameworks", si j'ouvre (petit triangle) le contenu de SecurityInterface.framework et regarde dans le dossier "Headers" de ce framework, je vois bien entre autres .h le fichier "SFAuthorizationView.h" définissant cette fameuse sous-classe de NSView que je veux utiliser...
    Mais même avec le framework ajouté au projet Xcode et donc le header inclus dedans, IB ne reconnait pas dans ce cas tout seul la classe SFAuthorizationView définie dans ledit framework. Dans ce cas particulier il faut faire glisser le .h dans la fenêtre du XIB/NIB dans IB pour qu'il en prenne connaissance.

    Je pense que c'est uniquement le cas avec les frameworks, pourtant moi aussi j'aurais pensé qu'il aurait synchronisé automatiquement comme pour les custom class faites maison... mais bon. Le tout c'est de connaà®tre l'astuce ;)
Connectez-vous ou Inscrivez-vous pour répondre.