cacher NSToolBarItem depuis un autre xib

Bonjour à  tous.



Voilà  ma situation critique image/crazy.gif' class='bbc_emoticon' alt=' B) ' /> :

Je charge un autre xib via:
<br />
[NSBundle loadNibNamed:@&quot;NewWindow&quot; owner:NSApp];<br />


NewWindow apparaà®t donc au premier plan devant ma fenêtre principale.

Sur ma fenêtre principale j'ai un NSToolBar avec plusieurs NSToolBarItem.

Mon but serait de cacher un NSToolBarItem lorsque j'appuie sur un bouton présent sur NewWindow.

1 erreur et un problème se présente:
<br />
NSToolBarItem *user;<br />
user.view = NO;<br />


Me donne l'avertissement suivant : "Incompatible integer to pointer conversion assigning to"NSView *" from BOOL (aka 'signed char')", ce que je ne comprend pas car sur ma fenêtre principale l'avertissement n'apparaà®t pas..

Et mon problème est que peut importe la commande, cela n'a aucun effet sur ma fenêtre principale même lorsque j'essai de caché un bouton. J'ai essayé de rafraichir la fenêtre sans succès.

Est ce qu'il y a une métode spécifique pour cacher ou afficher des objets d'un xib depuis un autre xib??



Merci d'avance pour votre aide..
«1

Réponses

  • Je pense que le problème viendrait de l'ouverture du xib, on dirait qu'il fige la fenêtre principale.

    J'ai utilisé un thread qui me fait planter mon appli, mais lorsque je le lance aucune fenêtre n'apparait lol
  • CéroceCéroce Membre, Modérateur
    Tu donnes tellement peu de code qu'il est impossible de te répondre.



    Tout ce que je peux dire est qu'on utilise normalement un NSWindowController pour charger une fenêtre depuis un nib.
  • cocoacola71cocoacola71 Membre
    février 2012 modifié #4
    Merci pour ta réponse.



    Oui c'est vrai que mon post n'est pas très garnis en code image/unsure.png' class='bbc_emoticon' alt=' :* ' />

    Alors voici le code que contient ma fenêtre pincipale:
    <br />
    - (IBAction)ajout:(id)sender{   //Bouton permettant l&#39;ouverture de la seconde fenêtre<br />
    NSWindowController *ns = [[NSWindowController alloc]initWithWindowNibName:@&quot;SessionAdd&quot;];<br />
    	[ns showWindow:self];<br />
    }<br />
    


    Cela m'ouvre bien en premier plan une seconde fenêtre, qui devrait lors de l'appuie sur un bouton m'afficher du texte dans un NSTextField de la fenêtre principale par exemple:
    <br />
    - (IBAction)ajoutIdMdp:(id)sender{<br />
    	chargWebBrows *mainWin= [chargWebBrows new];<br />
    	[mainWin.affichTest setStringValue:@&quot;lalalalala&quot;];<br />
    }<br />
    


    Hors la rien n'apparaà®t, peut importe ce que j'écris la fenêtre principale semble en aucun cas en liaison avec ma seconde fenêtre image/sad.png' class='bbc_emoticon' alt=':(' />
  • mpergandmpergand Membre
    février 2012 modifié #5
    <br />
    [color=#000000]  chargWebBrows [/color][color=#666600]*[/color][color=#000000]mainWin[/color][color=#666600]=[/color][color=#000000] [/color][color=#666600][[/color][color=#000000]chargWebBrows [/color][color=#000088]new[/color][color=#666600]];[/color]<br />
    [mainWin.affichTest setStringValue:@&quot;lalalalala&quot;];<br />
    




    que fait exactement /color][color=#000000]chargWebBrows [/color][color=#000088]new[/color][color=#666600 ?
  • Bonsoir, et merci de ton intéressement.



    [chargWebBrows new] me permet d'accéder à  ma classe chargWebBrows qui elle me permet enfaà®te de charger et utiliser dans ma fenêtre principale un WebView avec certain composants dont mon exemple suivant un NSTextField.

    Peut être que je mis prend mal pour appeler mon NSTextField que possède ma classe chargWebBrows.

    Etant débutant, je découvre et j'apprend par mes erreurs image/rolleyes.gif' class='bbc_emoticon' alt='::)' />
  • CéroceCéroce Membre, Modérateur
    février 2012 modifié #7
    Le problème est que la fenêtre enfant ne communique pas avec sa fenêtre parente.

    [chargWebBrows new] créé une nouvelle instance qui n'a rien à  voir avec l'instance de la fenêtre parente.



    Il n'existe deux manières de faire:

    1) poster une notification au NSNotificationCenter pour annoncer que le bouton a été actionné. Evidemment, le Window controller de la fenêtre parente se sera mis en auditeur de cette notification. Je déconseille cette approche.



    2) utiliser la délégation: je ne vais pas détailler parce que nous le rabâchons ici à  longueur d'année (et parce que j'ai fait ma journée et que je suis fatigué). Fais une recherche.



    P.S.:

    N'utilise pas la méthode new. Oui, ça existe, mais c'est équivalent à  [[alloc] init] qui est plus répandue parce que les méthodes d'init peuvent prendre des paramètres.



    Par convention, les noms de classe commencent toujours par des majuscules.
  • Merci de ta réponse,

    Je vais opter pour la délégation, et merci pour les PS.

    Cela me permettra de partir sur de bonne base image/thumbsup.gif' class='bbc_emoticon' alt='' />
  • cocoacola71cocoacola71 Membre
    février 2012 modifié #9
    Je me suis penché sur cette délégation! image/crazy.gif' class='bbc_emoticon' alt=' B) ' /> l'idée n'est pas simple lol

    Point de vue explication sur certain site, on pourrait parler d'usine à  GAZ..

    Si j'ai compris, voilà  ce que j'ai fait (qui bien sur ne tourne pas encore lol ,mais savoir si je suis sur la bonne piste me rassurerait sur la délégation) image/rolleyes.gif' class='bbc_emoticon' alt='::)' /> :

    .h ->
    <br />
    @interface ChargWebBrows : NSWindowController&lt;nsapplicationdelegate&gt;  //fenêtre principale<br />
    {<br />
    NSWindow *navigateur; // je suis en 32 bits<br />
    IBOutlet NSTextField *affichTest;<br />
    ....}<br />
    @property (assign) IBOutlet NSWindow *navigateur;<br />
    @property (retain, nonatomic) IBOutlet NSTextField *affichTest;<br />
    - (IBAction)ajout:(id)sender;<br />
    @end<br />
    @interface AjoutSession:NSWindowController&lt;nswindowdelegate&gt; //seconde fenêtre qui devrait modifier la fenêtre principale<br />
    {<br />
    .....}<br />
    - (IBAction)ajoutIdMdp:(id) sender;<br />
    @end<br />
    


    .m ->
    <br />
    - (IBAction)ajoutIdMdp:(id)sender{<br />
       ChargWebBrows *delegate = [[ChargWebBrows alloc]init];<br />
    	[delegate.navigateur setDelegate:self];<br />
    	[delegate.affichTest setHidden:YES];<br />
    }<br />
    




    Comme le montre ma seconde méthode, mon NSTextField de la fenêtre principale devrait disparaà®tre. Ce qui bien sur n'est pas le cas.



    Je pense et je suis même persuadé que mon code est une source d'erreurs que le compilateur ne détecte pas...

    Les forums et tuto sont géniaux mais je pense que votre avis et réflexions sont indispensables.

    Merci de votre temps image/cliccool.gif' class='bbc_emoticon' alt=' :p ' />
  • mpergandmpergand Membre
    février 2012 modifié #10
    ChargWebBrows *delegate = [/color][color=#660066]ChargWebBrows[/color][color=#000000] alloc[/color][color=#666600init];



    One more time image/rolleyes.gif' class='bbc_emoticon' alt='::)' />

    Tu crées une nouvelle fenêtre, donc aucune chance que tu puisses modifier celle déjà  affichée !



    Il te faut utiliser un fenêtre de dialogue ( en sheet ?)
  • cocoacola71cocoacola71 Membre
    février 2012 modifié #11
    Bonjour et merci de ton intervention.



    Je pensai qu'il était possible de modifier depuis une autre fenêtre.

    Merci pour ton idée! J'utilise:
    <br />
    [NSApp runModalForWindow:masecondefenete];<br />
    


    Hors ma seconde fenêtre est dans un autre .xib ce qui semble posé quelques soucis, puisque runModalForWindow n'ouvre que NSWindow et non NSWindowController (pour charger mon xib) image/sad.png' class='bbc_emoticon' alt=':(' />

    A croire que tout va contre moi!!!
  • CéroceCéroce Membre, Modérateur
    Un NSWindowController charge et gère une fenêtre.

    Cette fenêtre s'obtient par -[windowController window]
  • 'Céroce' a écrit:


    Un NSWindowController charge et gère une fenêtre.

    Cette fenêtre s'obtient par -[windowController window]


    Merci pour ta réponse, parle tu de délégation??



    Pour ce qui est de la boite de dialogue j'ai réussi à  l'ouvrir mais elle n'a aucun contrôle sur la fenêtre principale :
    <br />
    AjoutSession *aj = [[AjoutSession alloc]initWithWindowNibName:@&quot;SessionAdd&quot; owner:self];<br />
    [NSApp runModalForWindow:aj.window];<br />
    
  • Arff.. Il semblerait que toutes les solution mènent aux même résultat.

    Existe-t-il une autre solution pour modifié une fenêtre depuis une autre fenêtre??

    Si quelqu'un à  une idée je suis preneur image/rolleyes.gif' class='bbc_emoticon' alt='::)' />
  • Merci pour ta réponse je vais explorer cette solution image/smile.png' class='bbc_emoticon' alt=':)' />
  • mpergandmpergand Membre
    février 2012 modifié #17
    Un exemple d'utility Window (Palette)

    Palette est un singleton et communique avec les Documents via un protocole.



    Pour adapter cet exemple à  ses besoins, dupliquer le nib Palette et sous classer UtilityWindowController (UPalette dans mon exemple)



  • Merci pour ton exemple.

    Je trouve quand même que pour gérer une fenêtre depuis une autre ou même à  sa fermeture cela est très compliqué!!

    Alors que dans certain langages, tel que C#, 2 lignes suffisent! image/crazy.gif' class='bbc_emoticon' alt=' B) ' />
  • Il me manque rien du tout je pense pour que cela fonctionne :

    .h:
    <br />
    @interface MainFrame : NSView {    //Fenêtre pricipale<br />
    @public<br />
        IBOutlet NSTextField *affich;<br />
    }<br />
    - (IBAction)otherWin:(id)sender;<br />
    - (void) testModifcation;<br />
    @end<br />
    <br />
    @interface ControlWin : NSWindowController { //Ajout fenêtre control<br />
    @private<br />
        MainFrame *testClass;<br />
    }<br />
    @property (nonatomic, assign) MainFrame *testClass;<br />
    - (IBAction)modify:(id)sender;<br />
    @end<br />
    




    et pour le .m
    <br />
    @implementation MainFrame<br />
    - (IBAction)otherWin:(id)sender{<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
        controlFen.testClass = self;<br />
        [NSBundle loadNibNamed:@&quot;WindowControl&quot; owner:self];<br />
        [controlFen release];<br />
    }<br />
    - (void) testModifcation{				   //DEVRAIT AGIR SUR NSTEXTFIELD<br />
        [affich setStringValue:@&quot;lalala&quot;];<br />
    }<br />
    @end<br />
    <br />
    @implementation ControlWin<br />
    @synthesize testClass;<br />
    	<br />
    - (IBAction)modify:(id)sender{<br />
        [testClass testModifcation];			   //Cela me permettra par la suite d&#39;entrer des paramètres<br />
        //MainFrame *testCom = [MainFrame new];<br />
        //[testCom testModifcation];<br />
    }	<br />
    @end<br />
    




    J'ai recommencé un petit projet pour pouvoir réussir, et je pense que je n'en suis pas loin image/smile.png' class='bbc_emoticon' alt=':)' />

    Si quelqu'un à  une idée.

    Et merci à  tous de votre aide...
  • CéroceCéroce Membre, Modérateur
    Le problème est toujours le même: comment vas-tu accéder à  l'instance de ControlWin pour pouvoir appeler -modify: ?
  • Bonjour Céroce,

    J'accède à  mon instance lorsque j'appuie sur mon bouton présent sur ma seconde fenêtre.

    Le soucis est lorsque j'accède à  cette instance je n'accède pas à  TestModification (principe de délégation dont je me suis inspiré grâce à  ton lien http://forums.mediab.../apple/protocol[font=helvetica, arial, sans-serif] )[/font]

    Alors que si je déclare la classe Mainframe (les lignes en commentaires) j'accède TestModification mais ceci n'a aucun impact sur NSTextField.
  • mpergandmpergand Membre
    février 2012 modifié #22
    J'ai ajouté une gestion en sheet:
  • Merci image/smile.png' class='bbc_emoticon' alt=':)' />
  • D'accord je commence à  saisir les sheet!

    Mais ce que je comprend pas c'est le @selector :
    <br />
    @implementation MainFrame<br />
    - (IBAction)otherWin:(id)sender{<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self]; <br />
        [NSApp beginSheet:[controlFen window] modalForWindow:[controlFen window] modalDelegate:self didEndSelector:@selector(testmodification) contextInfo:controlFen];  //il appel ce que j&#39;aimerai faire à  l&#39;ouverture de la fenêtre alors que j&#39;aimerai que ça ce passe à  la fin de la fenêtre<br />
    }<br />
    - (void) testModifcation{			   <br />
        [affich setStringValue:@&quot;lalala&quot;];<br />
    }<br />
    <br />
    - (IBAction)fermSheet:(id)sender{  //relier au bouton de ma fenêtre controle<br />
        [self testModifcation];   //c&#39;est ici que cela devrait ce passer mais il n&#39;en prend pa en compte<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
        [NSApp endSheet:controlFen.window]; //Et cela ne fonctionne pas lol<br />
    }<br />
    


    Je suis désolé de vous embêter avec mes erreurs de débutant, mais la je parlerai plus d'incompréhension...
  • Le selector doit être de la forme:



    @selector(sheetDidEnd: returnCode: contextInfo:)


    //il appel ce que j'aimerai faire à  l'ouverture de la fenêtre alors que j'aimerai que ça ce passe à  la fin de la fenêtre




    no comprendo !
  • LOL oui ce n'est pas très explicite!

    BeginSheet ouvre une seconde fenêtre qui possède un bouton pour modifier la fenêtre principale.

    Ou est-ce que je doit mettre le code suite à  l'appuie du bouton??


  • <br />
    @implementation MainFrame<br />
    - (IBAction)otherWin:(id)sender{<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
        [NSApp beginSheet:[controlFen window] modalForWindow: (1ere fen) ?? modalDelegate:self<br />
    	  didEndSelector:@selector(sheetDidEnd: returnCode: contextInfo:) contextInfo:controlFen];<br />
    }[/color]<br />
    - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(id)controlFen<br />
    {<br />
    // traitement ici<br />
    [controlFen close];<br />
    [controlFen release];<br />
    [<br />
    }<br />
    <br />
    - (IBAction)fermSheet:(id)sender{  //relier au bouton de ma fenêtre controle<br />
      <br />
        [NSApp endSheet:sender.window];<br />
    }<br />
    
  • Génial merci pour ton explication!

    Tout semble fonctionner hors bizarrement je ne passe pas dans :
    <br />
    - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(id)controlFen<br />
    {<br />
    // traitement ici<br />
    [controlFen close];<br />
    [controlFen release];<br />
    }<br />
    




    Je passe correctement dans fermsheet pourtant image/crazy.gif' class='bbc_emoticon' alt=' B) ' />
  • mpergandmpergand Membre
    février 2012 modifié #29
    <br />
    - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(id)controlFen<br />
    {<br />
    // traitement ici<br />
    NSLog(@&quot;on ferme &#33;&quot;);<br />
    <br />
    [controlFen close];<br />
    [controlFen release];<br />
    }<br />
    






    Si la fenêtre se ferme, c'est que tu passes par sheetDidEnd:
  • J'ai pourtant mis un breakpoint à  l'étape de mon traitement.

    L'exécution du programme n'est pas bloqué par celui-ci image/sad.png' class='bbc_emoticon' alt=':(' />
  • Pas d'intérêt à  passer controlfen dans contextinfo car dans la method sheetDidEnd, sheet represente la controlfen

    Dans la method sheetDidEnd, passer un orderOut à  sheet provoque la fermeture (ou le passage hors écran selon choix fait pour la fenetre dans IB). C'est aussi là  qu'on teste le bouton cliqué (valeur de returnCode) lors de la fermeture, pour savoir si c'est annuler ou valider.

    Dans l'IBAction de fermeture on peut ajouter :

    NSApp endSheet: returnCode: je crois qui permet de donner une valeur NSOKButton ou à  returnCode

    Pour l'affichage/masquage de controls sous condition, on peut utiliser un binding de la propriété Hidden du control avec une propriété BOOL de l'appcontroller par exemple, qui est mise à  YES ou NO dans la 2ème fenêtre (Cf. KVO)
Connectez-vous ou Inscrivez-vous pour répondre.