NSPopover Xcode 6.4

Bonjour, je suis nouveau ici et viens suite à  un problème rencontré. 


 


Je suis également tout nouveau dans le monde de l'Objective-C en auto-formation, et j'ai beaucoup de mal à  instaurer un NSPopover dans un projet que je développe. 


 


Quelqu'un pourrait-t-il entrer en contact avec moi dans le but d'une conférence Skype/TeamViewer afin de me montrer la démarche à  suivre, ou alors, m'expliquer suite à  cette question la méthode pas à  pas pour créer ce NSPopover. 


 


J'ai un .xib avec deux boutons d'Help, je voudrais que ces boutons affichent chacun un NSPopover différent avec un texte que j'aurais définit auparavant. 


 


Je demande de la précision au maximum afin que je puisse comprendre le fonctionnement de cette fonctionnalité, et que je sache la réutiliser dans des cas différents à  l'avenir. 


 


Merci. 


Réponses

  • CéroceCéroce Membre, Modérateur

    J'étais parti pour t'expliquer, mais ça ne sert à  rien si tu ne connais pas les bases.


    Commence par lire le livre d'Aaron Hillegass.


     


    Utiliser un NSPopover est assez simple. Tu fixes sa propriété contentViewController, puis tu appelles 


    [popover showRelativeToRect:ofView:preferredEdge]. Mets son .behavior à  NSPopoverBehaviorTransient si tu veux le laisser gérer sa fermeture.


  • Je vais m'intéresser à  tout ça, merci.


  • Bonjour bonjour, 


     


    Après m'être repenché sur le sujet, j'ai fait quelques tests et une erreur me bloque un peu. J'ai vu des solutions qui pourraient éventuellement correspondre à  mon problème, mais je n'arrive pas à  les adapter. 


     


    Voici mon code : 



    - (IBAction)createTreePopover:(id)sender
    {
    if (self.myPopover == nil)
    {
    myPopover = [[NSPopover alloc] init];
    self.myPopover.contentViewController = popoverViewCOntrollerHUD;
    NSViewController *controller = [[NSViewController alloc] initWithNibName:@View bundle:nil];
    NSPopover *popover = [[NSPopover alloc] inità˜;
    [popover setContentSize:NSMakeSize(100.0f, 100.0f];
    [popover setContentViewController:controller];
    [popover setAnimates:YES];
    [popover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
    [popover release];
    }
    }
     

    Et voici le .h



    @class MyViewController;

    @interface ExportPreferences : NSPreferencePane <NSPopoverDelegate>
    {
    @private
    NSPopover *myPopover;


    NSUserDefaults *prefs;
    NSMutableArray *myArray;
    //IBOutlet NSMatrix *images; //
    IBOutlet NSButton *images;
    IBOutlet NSPopUpButton *modalities;
    IBOutlet NSPathControl *path;
    IBOutlet NSPopUpButton *tree;
    IBOutlet NSPopUpButton *extension;

    IBOutlet MyViewController *popoverViewControllerHUD;

    }

    - (void)mainViewDidLoad;
    - (IBAction)saveImages:(id)sender;
    - (IBAction)saveModalities:(id)sender;
    - (IBAction)savePath:(id)sender;
    - (IBAction)saveTree:(id)sender;
    - (IBAction)saveExtension:(id)sender;


    - (IBAction)createTreePopover:(id)sender;
    - (IBAction)createTypePopover:(id)sender;

    @property (retain) NSPopover *myPopover;

    @end

    Et enfin, l'erreur quand je clique sur le bouton d'help qui est censé faire pop le NSPopover : 


     



     


    16/09/2015 12:03:10,746 Hidden[28210]: -[ExportPreferences myPopover]: unrecognized selector sent to instance 0x79ae3470


     


     


     


    Quelqu'un pourrait m'éclairer là  dessus ? 


  • CéroceCéroce Membre, Modérateur
    septembre 2015 modifié #6
    Le message indique que ExportPreferences n'a pas de méthode myPopover, ce qui semble étrange, parce que tu as bien déclaré la propriété.
    Par contre, je vois une erreur: tu as déclaré une variable d'instance myPopover, or, la propriété va générer une variable appelée _myPopover par défaut.
     
    Commence par retirer les déclarations des variables d'instances, ça ne se fait plus et ça ne sert à  rien. Déclare uniquement des propriétés, même pour les outlets. Par ailleurs, je n'ai pas utilisé le mot clef @private depuis plus de dix ans. ça non plus, ça ne se fait plus.
    (Recherche sur le web "Objective-C anonymous category").
     
    Il y a une erreur dans cette ligne:
    NSViewController *controller = [[NSViewController alloc] initWithNibName:@View bundle:nil];
     
    Ce n'est pas une instance de NSViewController que tu veux, mais de la sous-classe que tu as créé.
    Disons que tu as créé une sous-classe de NSViewController appelée MyViewController (et pensé à  cocher la case pour créer le .xib associé), tu aurais:
     
    MyViewController *controller = [[MyViewController alloc] initWithNibName:@MyViewController bundle:nil];
     
    ou mieux:
    MyViewController *controller = [[MyViewController alloc] initWithNibName:nil bundle:nil];
  • XcrowzzXcrowzz Membre
    septembre 2015 modifié #7

    Bonjour, j'ai réussit à  implémenter le NSPopover sur un de mes boutons d'help. 


     


    J'ai fait de la sorte : 


     


    J'ai deux méthodes 



    - (IBAction) showInfoTreePopover:(id)sender {

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
    }

    - (IBAction) showInfoTypePopover:(id)sender {

    [[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
    }

    Chacune de ces méthodes correspond à  deux boutons d'help. 


     


    Ensuite, dans mon .xib, j'ai créé : 


    - Un Popover


    - Une Custom View


    - Un Label (pour la CV)


     


    Puis,


    Je link le bouton d'help avec la touche CTRL sur la méthode qui lui correspond dans le File's Owner


    Je ink mon File's Owner avec le Popover


    Je link le Popover View Controller à  la Custom View


     


    Et ce, deux fois de suite pour chacun de mes Popover. 


     


    La compilation fonctionne, et quand je lance le programme, j'ai effectivement un Popover sur mes boutons, mais c'est le même NSPopover qui apparait sur les deux boutons. Il semblerait que l'ajout du deuxième ait écrasé le premier. 


     


    Une solution ? 


  • CéroceCéroce Membre, Modérateur
    septembre 2015 modifié #8
    Si tu as deux popovers instanciés dans le xib, alors tu devrais avoir une outlet par popover:
    - (IBAction) showInfoTreePopover:(id)sender {

    [self.treePopover showRelativeToRect:sender.bounds ofView:sender preferedEdge:NSMaxY];
    }

    - (IBAction) showInfoTypePopover:(id)sender {

    [self.typePopover showRelativeToRect:sender.bounds ofView:sender preferedEdge:NSMaxY];
    }
    (Je ne sais plus si c'est NSMaxY, vérifie dans la doc).

    Note qu'il est peu courant d'instancier un popover dans un xib, parce qu'habituellement la vue affichée dans le popover est gérée par une sous-classe de NSViewContoller qui a son propre .xib " histoire de ne pas avoir un seul gros .xib géré par un seul gros View Controller.
  • Ca fonctionne, merci beaucoup !


     


    Je vais prendre en note ton conseil et essayer d'appliquer des modifications. Sujet résolu.


Connectez-vous ou Inscrivez-vous pour répondre.