plusieurs fenêtres, un nib chacune

bofybofy Membre
17:00 modifié dans API AppKit #1
Bonjour

Je sais ouvrir et fermer une fenêtre depuis la mainwindow, merci ClicCool.
Maintenant je voudrais faire la même chose mais avec un nib pour chacune :
le nib standard pour la mainwindow, un nib pour la deuxième fenêtre.
IB n'accepte qu'un nib semble-t-il ? Il faut donc programmer, mais comment ?

Réponses

  • ClicCoolClicCool Membre
    17:00 modifié #2
    Bonjour Bofy,

    Peut-être devrais-tu lire Introduction to Window Programming Guide for Cocoa avant de continuer à  jouer avec tes fenêtres ;)

    En l'occurrence la classe NSWindowController doit pouvoir t'aider à  proprement gérer des fenêtres ayant chacune leur nib.






    .
  • bofybofy Membre
    17:00 modifié #3
    dans 1205661943:

    Bonjour Bofy,

    Peut-être devrais-tu lire Introduction to Window Programming Guide for Cocoa avant de continuer à  jouer avec tes fenêtres ;)

    OK. C'est fait. Et je vais continuer à  jouer avec les fenêtres.

    En l'occurrence la classe NSWindowController doit pouvoir t'aider à  proprement gérer des fenêtres ayant chacune leur nib.

    OK. C'est fait depuis quelque temps, sans succès.

    Je me suis sans doute mal exprimé.

    En fait, je veux créer une application qui interroge PostgreSQL. Je sais faire dans une seule fenêtre, mais cette  fenêtre va être sur-encombrée, et ce n'est d'ailleurs pas recommandé dans le guideline d'Apple. J'ai donc besoin (au moins) de 4 fenêtres :
        - la fenêtre principale A,
        - trois fenêtres secondaire : B pour la connexion,  C pour la gestion, D pour l'interrogation.
    Chacune des trois fenêtres B,C,D correspond à  des activités différentes, et donc logiquement elles me semblent devoir être construites et gérées (presque) indépendamment : d'où l'idée dun nib et d'un controlleur par "sous-application".

    Rien n'est possible si dans un premier temps, je ne peux pas faire un minimum de choses sur une application multi fenêtres.

    Et en préalable, rendre visible une fenêtre B (déclarée "not visible at launch" dans IB) en cliquant sur un bouton de la fenêtre A.

    1ère question : est-ce possible avec IB sans programmation ?
        - si oui, je n'ai pas trouvé,
        - si non, j'aimerais le savoir et je me plongerai dans la programmation (je ne sais pas quand je referai surface)

    2ème question : dans mes nombreuses recherches sur ce thème je suis tombé sur l'exemple SimpleMultiWindow, qui, me semble-t-il, correspondait à  mon besoin et qui était fourni dans de précédentes versions de Xcode. Il a disparu de la version actuelle (3.0) et je ne suis par le seul à  en rechercher les sources, voire l'exécutable. Comment récupérer SimpleMultiWindow ?

    PS: lorsque je ne maà®trise pas quelque chose, j'ai besoin à  la fois d'exemples et de docs de référence...







    .
  • bofybofy Membre
    17:00 modifié #4
    dans 1205677936:

    dans 1205661943:

    Bonjour Bofy,

    Peut-être devrais-tu lire Introduction to Window Programming Guide for Cocoa avant de continuer à  jouer avec tes fenêtres ;)

    OK. C'est fait. Et je vais continuer à  jouer avec les fenêtres.

    En l'occurrence la classe NSWindowController doit pouvoir t'aider à  proprement gérer des fenêtres ayant chacune leur nib.

    OK. C'est fait depuis quelque temps, sans succès.

    Je me suis sans doute mal exprimé.

    En fait, je veux créer une application qui interroge PostgreSQL. Je sais faire dans une seule fenêtre, mais cette  fenêtre va être sur-encombrée, et ce n'est d'ailleurs pas recommandé dans le guideline d'Apple. J'ai donc besoin (au moins) de 4 fenêtres :
        - la fenêtre principale A,
        - trois fenêtres secondaire : B pour la connexion,  C pour la gestion, D pour l'interrogation.
    Chacune des trois fenêtres B,C,D correspond à  des activités différentes, et donc logiquement elles me semblent devoir être construites et gérées (presque) indépendamment : d'où l'idée dun nib et d'un controlleur par "sous-application".

    Rien n'est possible si dans un premier temps, je ne peux pas faire un minimum de choses sur une application multi fenêtres.

    Et en préalable, rendre visible une fenêtre B (déclarée "not visible at launch" dans IB) en cliquant sur un bouton de la fenêtre A.

    1ère question : est-ce possible avec IB sans programmation ?
        - si oui, je n'ai pas trouvé,
        - si non, j'aimerais le savoir et je me plongerai dans la programmation (je ne sais pas quand je referai surface)

    2ème question : dans mes nombreuses recherches sur ce thème je suis tombé sur l'exemple SimpleMultiWindow, qui, me semble-t-il, correspondait à  mon besoin et qui était fourni dans de précédentes versions de Xcode. Il a disparu de la version actuelle (3.0) et je ne suis par le seul à  en rechercher les sources, voire l'exécutable. Comment récupérer SimpleMultiWindow ?

    Au moins une réponse : installer Xcode 2.5, récupérer les "examples" et désinstaller Xcode 2.5.

    SimpleMultiWindow répond semble-t-il à  la plupart de mes souhaits...

    PS: lorsque je ne maà®trise pas quelque chose, j'ai besoin à  la fois d'exemples et de docs de référence...







    .

  • bofybofy Membre
    17:00 modifié #5
    Bonjour

    J'ai résolu mon problème concernant l'ouverture de plusieurs fenêtres, avec un nib chacune.

    Maintenant j'ose vouloir modifier les contrôles de la fenêtre B lorsque je clique sur un bouton de la fenêtre A.
    Je sais que c'est une abomination dans le monde des objets... et je devine que la solution passe par les delegates ou les notifications. J'ai lu plein de chose là -dessus (en anglais), il y a plein de discours et plein de YAKA, mais rien ni aucun exemple qui m'explique comment faire.

    Idem, je crée une instance d'un objet dans la fenêtre A. Comment en transférer la valeur dans une fenêtre B ?

    NB : je savais faire ça très bien en C...
  • BloodshedBloodshed Membre
    17:00 modifié #6
    Tu peux regarder du côté des bindings pour ça.
  • Philippe49Philippe49 Membre
    avril 2008 modifié #7
    dans 1206800447:


    Maintenant j'ose vouloir modifier les contrôles de la fenêtre B lorsque je clique sur un bouton de la fenêtre A.



    Ce serait plus structuré avec un contrôleur général, cependant, si ce n'est pas le cas :

    En l'absence de contrôleur général qui ait des références sur les deux NSWindowController, le mieux est de poster une notification.

    1) Dans awakeFromNib (ou windowDidLoad)
    On enregistre le NSWindowControllerA par la méthode ad-hoc de NSNotificationCenter.
      NSNotificationCenter * defaultCenter=[NSNotificationCenter defaultCenter];
      [defaultCenter addObserver:self selector:@selector(maMethode:) name:@myName object:nil];

    2) Lors d'un changement dans la fenêtre B
    Celui qui reçoit le changement (à  priori NSWindowControllerB) poste une notification
       NSNotificationCenter * defaultCenter=[NSNotificationCenter defaultCenter];
       [defaultCenter postNotificationName:@myName object:self userInfo:aDictionary];
    On met ce qu'on veut dans aDictionary.


    3) Le WindowControllerA reçoit la notification
    dans la méthode   -(void)maMethode:(NSNotification *)notification
    Il retrouve le dictionnaire et les infos transmises dans [notification userInfo], l'objet qui a envoyé la notification dans [notification object]
    Il en fait ce qu'il en veut ...





  • bofybofy Membre
    17:00 modifié #8
    dans 1206808127:

    Tu peux regarder du côté des bindings pour ça.


    Merci, un exemple svp ? la doc "Communicating With Objects" n'est pas tres explicite.
  • BloodshedBloodshed Membre
    17:00 modifié #9
    Ce tutorial sur les bindings est très bien :
    http://homepage.mac.com/mmalc/CocoaExamples/bindingsNutshell.html
    Et il y'a foule d'exemples associés :
    http://homepage.mac.com/mmalc/CocoaExamples/controllers.html
  • Philippe49Philippe49 Membre
    17:00 modifié #10
    Merci Bloodshed pour ces références sur les Bindings, il y en a aussi quelques uns sur ce site par ClicCool ou Hoksitan.

    Je rappelle néammoins que débuter par les Bindings en Cocoa/Objective-C cela devient très vite difficile (comment faire en aveugle ce qu'on ne sait pas faire à  la clarté du jour) et conseille aux gens qui débutent de faire "à  la main". Ils pourront alors observer combien la programmation Cocoa est simple.
    C'est mon opinion de (re)débutant d'un an et demi maintenant. 
    Ceci ne retire en rien l'estime que j'ai pour la technologie des Bindings, qui fonctionnent sur le KVO à  la mode des notifications ...
  • Philippe49Philippe49 Membre
    avril 2008 modifié #11
    dans 1207053078:

    Mais je ne comprends pas très bien le 1) : je n'ai pas de awakeFromNib, ou alors masqué par IB ?

    Tout objet du nib reçoit un message awakeFromNib après avoir été instancié.
    Consulte NSNibAwaking Protocol Reference
    Tu rajoutes simplement ceci au code de tes NSWindowController, cela devrait marcher (File Owner's devrait être une instance de es window controller)
    Sinon, tu peux ajouter cela dans une méthode qui est appelée assez tôt.

    dans 1207053078:

    Faut-il créer une instance de NSNotificationCenter ?

    Non, defaultCenter est partagé .


  • bofybofy Membre
    17:00 modifié #12
    dans 1207054415:

    dans 1207053078:

    Mais je ne comprends pas très bien le 1) : je n'ai pas de awakeFromNib, ou alors masqué par IB ?

    Tout objet du nib reçoit un message awakeFromNib après avoir été instancié.
    Consulte NSNibAwaking Protocol Reference
    Tu rajoutes simplement ceci au code de tes NSWindowController, cela devrait marcher (File Owner's devrait être une instance de es window controller)
    Sinon, tu peux ajouter cela dans une méthode qui est appelée assez tôt.

    dans 1207053078:

    Faut-il créer une instance de NSNotificationCenter ?

    Non, defaultCenter est partagé .



    Je comprends pas très bien comment tout ça marche, mais ça marche entre deux fenêtres comme à  l'intérieur d'une fenêtre. C'était ce que je voulais.

    Une question tout de même à  propos du dictionnaire : si j'ai bien compris, ça marche par couple (key, object) ; object peut-il être de tout type, pas seulement des strings ?

    Encore un grand merci, et je plonge dans la doc, mais maintenant en sachant où je vais.
  • Philippe49Philippe49 Membre
    avril 2008 modifié #13
    dans 1207145094:

    Je comprends pas très bien comment tout ça marche, mais ça marche entre deux fenêtres comme à  l'intérieur d'une fenêtre. C'était ce que je voulais.

    Tu peux lancer ton appli sous mode Debug, mettre un point d'arrêt et observer la pile d'exécution des messages.
    En fait entre les messages que tu provoques, le run-time, la boucle d'événements, les mécanismes d'observations, ... en glissent un certain nombre, dont la mise à  jour des notifications.
    C'est pour cela l'enregistrement en tant qu' "observer" : on inscrit telle instance pour rcevoir en temps voulu des messages.

    dans 1207145094:

    Une question tout de même à  propos du dictionnaire : si j'ai bien compris, ça marche par couple (key, object) ; object peut-il être de tout type, pas seulement des strings ?

    Oui : Tu peux mettre n'importe quel objet, par contre les "key" sont des NSString *.

    Ceci dit pour les notifications, la connaissance de l'objet qui envoie la notification permet d'accéder à  ses variables :

    NSWindowControllerB * wController=[notification object];
    NSTextField * textFieldOfB=[wController valueForKey:@textField];
    ...
  • bofybofy Membre
    17:00 modifié #14
    Merci à  tous

    Je sais faire (presque) le minimum de que je veux avec une structure d'application de ce genre !
Connectez-vous ou Inscrivez-vous pour répondre.