cacher NSToolBarItem depuis un autre xib

2»

Réponses

  • Merci de ton explication, mais si je ne me trompe pas le @selector appel la méthode sheetDiEnd:...

    Donc je devrait passer tout de même à  l'intérieur.

    Comme le nom l'explique je devrait passer à  l'intérieur lorsque fermSheet est exécuter.

    Hors peut importe ce qui ce passe ma fenêtre s'ouvre et se ferme correctement sans appeler sheetDidEnd:...
  • essaye en supprimant les espaces dans :
    <br />
    @selector(sheetDidEnd: returnCode: contextInfo:)<br />
    
  • Oui j'avais essayé malheureusement sans succès...
  • 'uocram' a écrit:


    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)


    Je pense que tu as raison car voici l'erreur qui est afficher lors de l'execution : "endsheet:returnCode: Requires a non-nil sheet".

    J'ai essayé:
    <br />
    [NSApp endsheet:[control Fen window] returnCode:YES];<br />
    


    Mais cela ne semble pas convenir
  • Montre ton code, sinon on va pas s'en sortir ...
  • <br />
    @implementation MainFrame<br />
    @synthesize premFen;<br />
    - (IBAction)otherWin:(id)sender{<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
        [NSApp beginSheet:[controlFen window] modalForWindow:premFen modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:controlFen]; <br />
    }<br />
    - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(id)controlFen<br />
    {<br />
        [self testModifcation];<br />
       // [sheet orderOut:self];<br />
        [controlFen close];<br />
        [controlFen release];<br />
    }<br />
    - (IBAction)fermSheet:(id)sender{<br />
        ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
        [NSApp endSheet:[controlFen window] returnCode: YES];<br />
    }<br />
    
  • 'cocoacola71' a écrit:

    <br />
    - (IBAction)fermSheet:(id)sender{<br />
    	ControlWin *controlFen = [[ControlWin alloc] initWithWindowNibName:@&quot;WindowControl&quot; owner:self];<br />
    	[NSApp endSheet:[controlFen window] returnCode: YES];<br />
    }<br />
    





    Tu le fais exprès ?
  • Oups la redéclaration! image/crazy.gif' class='bbc_emoticon' alt=' B) ' />

    Cela faisait partit de mes nombreux tests, mais je reviens au point de départ je n'ai plus d'erreur mais je n'arrive pas dans SheetDidEnd:
  • Montre plus de code.
  • cocoacola71cocoacola71 Membre
    février 2012 modifié #41
    .h:
    <br />
    @interface MainFrame : NSObject{<br />
    @public<br />
    	IBOutlet NSTextField *affich;<br />
    	NSWindow *premFen;<br />
    	NSWindow *secFen;<br />
    	IBOutlet id bouton;<br />
    }<br />
    - (IBAction)otherWin:(id)sender;<br />
    - (IBAction)fermSheet:(id)sender;<br />
    - (void) testModifcation;<br />
    - (IBAction)fermSheet:(id)sender;<br />
    //- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(id)controlFen<br />
    @property (assign) IBOutlet NSWindow *premFen;<br />
    @property (assign) IBOutlet NSWindow *secFen;<br />
    @end<br />
    <br />
    @interface ControlWin : NSWindowController {<br />
    @private<br />
    }<br />
    @end<br />
    


    Et voilà  (c'est un fichier test)

    J'ai très peu de code pour éviter de tout détérioré avec mes test lol
  • mpergandmpergand Membre
    février 2012 modifié #42
    et le fichier .m ?





    Sinon, mets des NSLog() dans tes routines, tu verras si elles sont bien appelées.



    Vérifie aussi que tes objets ne sont pas à  nil:

    NSLog(@%@",[controlFen window]);



    etc ...



    Si la fenêtre sheet se ferme, c'est que sheetDidEnd est bien appelé.
  • Bonjour,

    Et merci de ta réponse..

    Je vais utilisé les Nslog. Pour ce qui est du .m c'est le post d'avant..

    Je n,est pas plus de code concerné
  • Bonjour à  vous,



    Comme mpergand l'a précisé j'ai vérifié [controFen window];

    Et celui-ci est bien nil.

    Comment cela ce fait-il? La fenêtre est bien relié à  ma classe pourtant...
  • Bonjour à  tous!



    Me revoilà  sur ce sujet avec quelques réponses!!

    Je pense que j'ai surement chercher trop compliqué!

    Pour lancer une anotherWindow en actualisant ma mainWindow j'ai trouver showWindow:
    <br />
    NSWindowController *winControl = [[NSWindowController alloc] initWithWindowNibName:@&quot;ajoutWindow&quot; owner:self];<br />
    [winControl showWindow:nil];<br />
    


    Cela correspond tout à  fait à  mon attente sauf que ma mainWindow est actualisée au lancement de ma anotherWindow, et moi j'aurai voulu ma mainWindow passe par awakeFromNib à  la fermeture de anotherWindow.

    Est possible de faire l'inverse image/smile.png' class='bbc_emoticon' alt=':)' /> ?
  • Me revoilà !



    J'ai donc utiliser beginsheet!

    Mais le résultat est le même, j'ai cru comprendre dans les posts précédent que Sheet permettait d'interagir sur la fenêtre principale :
    <br />
    	    NSWindowController *win =[[NSWindowController alloc] initWithWindowNibName:@&quot;AjoutSupprSess&quot; owner:self];<br />
    	    [NSApp beginSheet:[win window] modalForWindow:navigateurWin modalDelegate:nil didEndSelector:nil contextInfo:nil];<br />
    	    [NSApp runModalForWindow:[win window]];<br />
    <br />
    	    [NSApp endSheet:[win window]];<br />
    	    [[win window] orderOut:self];<br />
    


    Je me trompe?



    Merci de votre aide.
  • cocoacola71cocoacola71 Membre
    mars 2012 modifié #47
    Et voici l'erreur générer lors de l'ouverture de la fenêtre:
    <br />
    2012-03-15 14:34:03.399 AppliVersion1[8517:307] *** Assertion failure in -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:], /SourceCache/AppKit/AppKit-1138.32/AppKit.subproj/NSApplication.m:3861<br />
    2012-03-15 14:34:03.400 AppliVersion1[8517:307] Modal session requires modal window<br />
    2012-03-15 14:34:03.403 AppliVersion1[8517:307] (<br />
    0   CoreFoundation					  0x99c14b67 __raiseError + 231<br />
    1   libobjc.A.dylib					 0x9250c149 objc_exception_throw + 155<br />
    2   CoreFoundation					  0x99b7c369 +[NSException raise:format:arguments:] + 137<br />
    3   Foundation						  0x920d6267 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116<br />
    4   AppKit							  0x92e86af8 -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:] + 725<br />
    5   AppKit							  0x92e873cc -[NSApplication beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:] + 140<br />
    6   AppliVersion1					   0x000060a2 -[Navigateur ajoutSupprView:] + 242<br />
    7   CoreFoundation					  0x99b69de1 -[NSObject performSelector:withObject:] + 65<br />
    8   AppKit							  0x93292108 -[NSToolbarButton sendAction:to:] + 99<br />
    9   AppKit							  0x93292166 -[NSToolbarButton sendAction] + 82<br />
    10  AppKit							  0x92d61778 -[NSToolbarItemViewer mouseDown:] + 5944<br />
    11  AppKit							  0x92c85ca5 -[NSWindow sendEvent:] + 7533<br />
    12  AppKit							  0x92c1e0e7 -[NSApplication sendEvent:] + 4788<br />
    13  AppKit							  0x92baf6d5 -[NSApplication run] + 1007<br />
    14  AppKit							  0x92e43261 NSApplicationMain + 1054<br />
    15  AppliVersion1					   0x000029cb main + 43<br />
    16  AppliVersion1					   0x00002995 start + 53<br />
    )<br />
    


    Même si ma fenêtre s'ouvre quand même de quoi cela pourrait venir?
  • Pourtant j'ai bien relié window à  File's Owner image/whip.gif' class='bbc_emoticon' alt=' >:) ' />
  • Je pense que j'ai besoin d'être éclairé...

    Je reprend:

    - J'ai une classe principale -> MainClass:Webview

    Dans celle ci ce trouve une méthode qui contient:
    <br />
                NSWindowController *win =[[NSWindowController alloc] initWithWindowNibName:@&quot;AjoutSupprSess&quot; owner:self];<br />
                NSLog(@&quot;valeur window : %@&quot;,[win window]); // CECI EST NULL<br />
    		    [NSApp beginSheet:[win window] modalForWindow:navigateurWin modalDelegate:nil didEndSelector:nil contextInfo:nil];<br />
    		    [NSApp runModalForWindow:[win window]];<br />
    		    [NSApp endSheet:[win window]];<br />
    		    [[win window] orderOut:self];<br />
    




    - J'ai une autre classe -> SecondClass:NSObject

    Dans laquelle mon xib correspondant est délégué à  File's Owner (Lien entre ma fenêtre et File's Owner).



    Que me manque t'il pour que [win window] soit différent de nil.

    Je suis persuadé que j'ai fait une erreur, car File's Owner semble pour moi une terre inconnue..

    Je pense connaà®tre son utilisation mais la je suis largué!! image/sad.png' class='bbc_emoticon' alt=':(' />
  • mpergandmpergand Membre
    mars 2012 modifié #51
    Il faut sous classer NSWindowController !



    et comme tu utilises un sheet, il faut un bouton close dans celui-ci, donc pour le file's owner (ton WindowController) dans le nib "AjoutSupprSess", tu définis une action "endSheet:" et tu fais le lien avec le bouton close.

    Tu implémentes cette action dans la classe qui appelle le sheet:
    <br />
    -(void) openWin:(id) sender<br />
    {<br />
    [color=#000000]  My[/color][color=#660066]WindowController[/color][color=#000000] [/color][color=#666600]*[/color][color=#000000]wc [/color][color=#666600]=[[My[/color][color=#660066]WindowController[/color][color=#000000] alloc[/color][color=#666600]][/color][color=#000000] initWithWindowNibName[/color][color=#666600]:@[/color][color=#008800]&quot;AjoutSupprSess&quot;[/color][color=#000000] owner[/color][color=#666600]:[/color][color=#000088]self[/color][color=#666600]];[/color]<br />
    [color=#000000]  [/color][color=#660066]NSLog[/color][color=#666600](@[/color][color=#008800]&quot;valeur window : %@&quot;[/color][color=#666600],[[/color][color=#000000]win window[/color][color=#666600]]);[/color][color=#000000] [/color]<br />
    [color=#000000]  [/color][color=#666600][[/color][color=#660066]NSApp[/color][color=#000000] beginSheet[/color][color=#666600]:[[/color][color=#000000]wc window[/color][color=#666600]][/color][color=#000000] modalForWindow[/color][color=#666600]:[/color][color=#000000]navigateurWin modalDelegate[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#000000] didEndSelector[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#000000] contextInfo[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#666600]];[/color]<br />
    [color=#000000]  [/color][color=#666600][[/color][color=#660066]NSApp[/color][color=#000000] runModalForWindow[/color][color=#666600]:[[/color][color=#000000]wc window[/color][color=#666600]]];[/color]<br />
    <br />
    // traitement ici<br />
    NSLog(@&quot;fin du mode modal&quot;);<br />
    <br />
    [wc release];<br />
    }<br />
    <br />
    -(void) endSheet:(id) sender		// définie dans IB pour le file&#39;s owner, cà d self<br />
    {<br />
    [NSApp enSheet:[sender window]];<br />
    [NSApp stopModal];<br />
    [[sender window] orderOut:nil];<br />
    <br />
    }<br />
    <br />
    <br />
    




    A ta décharge, il faut bien dire que la gestion des NSWindowController est bien tordu et ça appelle awakeFromNib ! (corrigé dans Lion il me semble)

    Maintenant, le plus simple c'est d'utiliser NSBundle loadNibNamed: ou encore de mettre la fenêtre sheet dans le même nib (sur mac ça va pas saturer la mémoire image/rolleyes.gif' class='bbc_emoticon' alt='::)' /> )
  • Hello et merci pour tes explications mpergand!

    On peut enfin conclure ce sujet, car il est résolut image/cliccool.gif' class='bbc_emoticon' alt=' :p ' />

    Voici donc la conclusion :
    <br />
        [NSBundle loadNibNamed:@&quot;AjoutSupprSess&quot; owner:self]; //AjoutSupprSess -&gt; File&#39;s Owner<br />
        [NSApp beginSheet:ajoutSupprWin modalForWindow:navigateurWin modalDelegate:nil didEndSelector:nil contextInfo:nil];<br />
        [NSApp runModalForWindow:ajoutSupprWin];<br />
    <br />
        //[NSApp stopModal] se trouve dans plusieurs boutons sur ma sheet   <br />
    <br />
        [self chargement];<br />
        [NSApp endSheet:ajoutSupprWin];<br />
        [ajoutSupprWin orderOut:nil];<br />
    


    Merci à  vous tous pour votre aide et vos explications image/thumbsup.gif' class='bbc_emoticon' alt='' />
  • mpergandmpergand Membre
    mars 2012 modifié #53
    Bon, si tu ne fais pas de release sur ta fenêtre, tu crées une nouvelle fenêtre à  chaque fois !

    Le plus simple c'est de cocher "Release when closed" pour cette fenêtre dans IB et faire:
    <br />
    <br />
    [color=#666600][[/color][color=#660066]NSBundle[/color][color=#000000] loadNibNamed[/color][color=#666600]:@[/color][color=#008800]&quot;AjoutSupprSess&quot;[/color][color=#000000] owner[/color][color=#666600]:[/color][color=#000088]self[/color][color=#666600]];[/color][color=#000000] [/color][color=#880000]//AjoutSupprSess -&gt; File&#39;s Owner[/color]<br />
    [color=#666600][[/color][color=#660066]NSApp[/color][color=#000000] beginSheet[/color][color=#666600]:[/color][color=#000000]ajoutSupprWin modalForWindow[/color][color=#666600]:[/color][color=#000000]navigateurWin modalDelegate[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#000000] didEndSelector[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#000000] contextInfo[/color][color=#666600]:[/color][color=#000088]nil[/color][color=#666600]];[/color]<br />
    [color=#666600][[/color][color=#660066]NSApp[/color][color=#000000] runModalForWindow[/color][color=#666600]:[/color][color=#000000]ajoutSupprWin[/color][color=#666600]];[/color]<br />
    <br />
    [color=#666600][[/color][color=#000088]self[/color][color=#000000] chargement[/color][color=#666600]];[/color]<br />
    <br />
    [color=#666600][[/color][color=#660066]NSApp[/color][color=#000000] endSheet[/color][color=#666600]:[/color][color=#000000]ajoutSupprWin[/color][color=#666600]];[/color]<br />
    [color=#666600][[/color][color=#000000]ajoutSupprWin close[/color][color=#666600]];[/color]<br />
    [color=#666600]ajoutSupprWin=nil;  // évite de manipuler une pointeur fou ...[/color]<br />
    <br />
    
  • Bonjour!



    Merci pour le conseil, je l'ai mis en exécution de suite!

    Tout fonctionne parfaitement! image/implore.gif' class='bbc_emoticon' alt=' o:) ' />
Connectez-vous ou Inscrivez-vous pour répondre.