Modal Dialog qui n'apparait pas comme il faut [Résolu]

npantinpanti Membre
juillet 2010 modifié dans API AppKit #1
Bonsoir à  tous,

Je voudrais faire apparaitre une modal dialog mais elle ne veux pas apparaitre en glissant sous la barre d'état de l'application. Elle apparait simplement comme une nouvelle fenêtre
J'obtiens l'erreur suivante:
2010-07-11 19:21:52.492 Stock[40634:a0f] *** Assertion failure in -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:], /SourceCache/AppKit/AppKit-1038.32/AppKit.subproj/NSApplication.m:3100<br />2010-07-11 19:21:52.492 Stock[40634:a0f] Modal session requires modal window


Voici le code source des fonctions que j'utilise pour afficher cette modal dialog
- (void)openAddStockSheet:(NSWindow *)sheet<br />{<br />	if (!sheet)<br />		[NSBundle loadNibNamed:@&quot;AddStock&quot; owner:self];<br />	<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;%@&quot;, [super window]);<br />	[NSApp beginSheet:sheet<br />	&nbsp;  modalForWindow:[super window]<br />		modalDelegate:self<br />	&nbsp;  didEndSelector:nil<br />		&nbsp; contextInfo:nil];<br />	<br />	[NSApp runModalForWindow:sheet];<br />	[NSApp endSheet:sheet];<br />	[sheet orderOut:self];<br />}<br /><br />- (IBAction)closeAddStockSheet:(id)sender<br />{<br />&nbsp; &nbsp; [NSApp stopModal];<br />}<br /><br />- (IBAction)showAddStockSheet:(id)sender<br />{<br />	[self openAddStockSheet:addStockSheet];<br />}


Voici la structure de mon programme
class.jpg

Ma classe Stock_AppDelegate possède un attribut NSWindow *window qui est bien lié dans Interface Builder à  la fenêtre principale de mon application

J'ai donc un peu de mal à  comprendre cette erreur, de plus le NSLog me retourne bien une NSWindow.
Si quelqu'un sait comment régler ce problème.

D'avance merci

Réponses

  • CéroceCéroce Membre, Modérateur
    17:28 modifié #2
    <br />	[NSApp beginSheet:sheet modalForWindow:[super window] modalDelegate:self didEndSelector:nil&nbsp; contextInfo:nil];<br />	[NSApp runModalForWindow:sheet];<br />
    


    Il faut que tu choisisses entre les deux:
    - une sheet est une fenêtre attachée en haut d'une autre: la fenêtre parente est bloquée, mais les autres fenêtres (par ex. autres documents), peuvent toujours être manipulées.
    - une fenêtre modale bloque tout le court de l'application et empêche de mettre les autres fenêtres au 1er plan.
  • npantinpanti Membre
    17:28 modifié #3
    C'est bizarre que je dois choisir entre l'une des deux, car j'ai exactement fait comme dans la doc d'apple

    http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Sheets/Tasks/UsingAppModalDialogs.html#//apple_ref/doc/uid/TP40001207-BABFIBIA

    Même erreur si je choisi l'une ou l'autre. C'est à  n'y rien comprendre.
  • mpergandmpergand Membre
    17:28 modifié #4
    Je confirme qu'il n'y a aucun problème à  faire une sheet bloquante.

    Pour moi, l'erreur vient de [super window], elle est bien visible ?
  • npantinpanti Membre
    17:28 modifié #5
    Oui j'ai vérifier tout ça, la variable window contient bien toutes les informations sur la fenêtre ou le sheet doit apparaà®tre
  • manu57manu57 Membre
    17:28 modifié #6
    As tu vérifier que "sheet" était bien rempli après le chargement du nib ?
    Parce que comme ton code est écrit, tu attends que loadNibNamed modifie le contenu de la variable locale "sheet", ce qui est impossible.

    Manu

  • mpergandmpergand Membre
    17:28 modifié #7
    Le [super window] est curieux !

    Soit, window est une méthode, alors on peut faire [self window];
    Soit, c'est une variable d'instance et elle est accessible directement (sauf si déclaré private)

    Et ta classe Stock_AppDelegate, elle hérite de qui ?
  • npantinpanti Membre
    17:28 modifié #8
    [super window] et window retourne la même chose
    Sur mon diagramme de classe tu peux voir que Stock_AppDelegate hérite de NSObject et dans cette classe une variable NSWindow est lié via IB à  ma fenêtre principale
  • mpergandmpergand Membre
    17:28 modifié #9
    NSObject ne possède pas d'attribut window, NSView oui.
  • npantinpanti Membre
    17:28 modifié #10
    Ma variable NSWindow est défini dans mon Stock_AppDelegate
  • mpergandmpergand Membre
    juillet 2010 modifié #11
    Alors, pourquoi tu fais [super window] ?

    En fait tu fais l'appel depuis stockListController ?
  • npantinpanti Membre
    17:28 modifié #12
    J'ai fait [super window] pour que je puissent voir directement que la variable window est héritée et pas définie explicitement dans ma classe StockListController, mais j'obtiens le même objet NSWindow en utilisant window tout court
  • mpergandmpergand Membre
    17:28 modifié #13
    Bon, je jette l'éponge  :D

    Typiquement, cette erreur survient lorsqu'il y a un problème avec le fenêtre parente (nil, pas une fenêtre, pas ouverte, etc)
  • npantinpanti Membre
    17:28 modifié #14
    :P,  c'est effectivement étrange car lorsque je lance mon application est que je regarde ce que contient la variable window elle contient bien toutes les informations de la fenêtre principale.
  • manu57manu57 Membre
    17:28 modifié #15
    Relis mon message plus haut,  c'est sheet qui est nil.

  • npantinpanti Membre
    17:28 modifié #16
    <3 J'ai trouvé, en fait le problème était dans IB, je n'avais pas défini la classe dans <i>File's Owner.
    J'ai aussi implémenter une autre classe pour gérer l'ouverture de mon sheet.

    @manu57, mon sheet n'était pas nul vu qu'il s'affichait, il ne s'affichait juste pas en glissant sous le haut de ma fenêtre principale comme il aurait du.

    Merci à  tous
  • manu57manu57 Membre
    17:28 modifié #17
    Les variables locales ont la priorité sur les ivar. donc dans ton code, lorsque tu fais référence à  sheet, c'est le paramètre de la methode qui est utilisé et non l'ivar. Il doit d'ailleurs un warning dans le résultat du build de type "warning: local declaration of 'sheet' hides instance variable".

    Ton sheet s'affichait parce que le flag "visible at launch" est setté par defaut dans IB, et donc la fenêtre sheet est affichée automatiquement lors du chargement du nib.

    Ceci étant, content que tu ais résolu ton problème.

    Manu
  • npantinpanti Membre
    17:28 modifié #18
    Effectivement tu as raison, visible at launch était bien coché dans IB, merci ;)
  • CéroceCéroce Membre, Modérateur
    17:28 modifié #19
    dans 1278928853:

    Je confirme qu'il n'y a aucun problème à  faire une sheet bloquante.

    Admettons, mais conceptuellement, c'est quand même déboussolant pour l'utilisateur.
Connectez-vous ou Inscrivez-vous pour répondre.