[resolu] 10.5 NSOpenPanel non modal

cyranocyrano Membre
mars 2011 modifié dans API AppKit #1
bonsoir,

peut on avoir un openPanel 10.5 non modal?

en 10.6 je fais
<br />&nbsp; &nbsp; [openPanel beginWithCompletionHandler:^(NSInteger returnCode) {<br />&nbsp; &nbsp; &nbsp; &nbsp; if(returnCode == NSFileHandlingPanelOKButton) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [theZoo startScript:[[openPanel URLs] lastObject]];<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }];<br />


que dois je utiliser en 10.5 ?

Réponses

  • CéroceCéroce Membre, Modérateur
    13:00 modifié #2
    Les blocs n'existent pas sous 10.5.

    Utilise plutôt
    [tt]- (void)beginForDirectory:(NSString *)absoluteDirectoryPath file:(NSString *)filename types:(NSArray *)fileTypes modelessDelegate:(id)modelessDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo[/tt]
  • hcyranohcyrano Membre
    mars 2011 modifié #3
    dans 1300779323:

    Les blocs n'existent pas sous 10.5.

    Utilise plutôt
    [tt]- (void)beginForDirectory:(NSString *)absoluteDirectoryPath file:(NSString *)filename types:(NSArray *)fileTypes modelessDelegate:(id)modelessDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo[/tt]


    oui, bien sur

    je mets quoi en modelessDelegate, j'ai pas bien compris le parametre :-( a part l'objet qui implemente didEndSelector)

    des que je bouge la souris, le panel se ferme ? :(
  • hcyranohcyrano Membre
    mars 2011 modifié #4
    dans 1300784025:

    des que je bouge la souris, le panel se ferme ? :(


    le openPanel n'etait pas retenu. (curieux comme comportement)
  • laudemalaudema Membre
    13:00 modifié #5
    dans 1300786596:

    dans 1300784025:

    des que je bouge la souris, le panel se ferme ? :(


    le openPanel n'etait pas retenu. (curieux comme comportement)

    J'aimerais en avoir la confirmation mais
    1) il existe encore dans ta méthode quand il est dessiné à  l'écran
    2) tu bouges la souris, l'écran doit se rafraà®chir mais il n'est plus là  pour répondre
    Cohérent ?
  • cyranocyrano Membre
    13:00 modifié #6
    il est referencé par [NSOpenPanel openPanel] donc autorelease  ???

    au cycle suivant il n'existe plus, bien que je ne l'ai pas fermé (c'est ce comportement que je trouve illogique).
  • AliGatorAliGator Membre, Modérateur
    13:00 modifié #7
    Tant qu'il est visible il est pas installé dans la RunLoop automatiquement (car affiché sous forme de modal ou de sheet) et donc retenu par ladite runloop normalement ?
  • cyranocyrano Membre
    13:00 modifié #8
    bin non  B)
  • AliGatorAliGator Membre, Modérateur
    13:00 modifié #9
    Heu ceci dit pour qu'il soit installé dans la RunLoop en mode modal, il faut démarrer le mode modal de la runloop, l'as-tu fait ? (méthode beginModalForWindow)

    cf le Programming Topic dédié "Using Application-Modal Dialogs" dans la doc
  • CéroceCéroce Membre, Modérateur
    13:00 modifié #10
    @Cyrano: Je confirme ce que tu observes  +[NSOpenPanel openPanel] renvoie un objet autoreleasé.

    @Ali: il ne veut pas qu'il soit modal. Je t'avoue que moi aussi, je me serais attendu à  ce qu'il soit retenu par la run loop.

  • laudemalaudema Membre
    13:00 modifié #11
    dans 1300792726:

    il est referencé par [NSOpenPanel openPanel] donc autorelease  ???

    au cycle suivant il n'existe plus, bien que je ne l'ai pas fermé (c'est ce comportement que je trouve illogique).

    Quand tu entres dans ta méthode AppKit crée un autorelase pool pour toi en arrière plan. Quand tu crées ta fenêtre via [NSOpenPanel openPanel] il appartient à  ce pool et tu peux l'afficher mais quand tu sors de la méthode le pool est vidé, un petit peu après la sortie mais avant que tu ne bouges la souris: ce qui est affiché n'existe plus.
  • cyranocyrano Membre
    13:00 modifié #12
    je vous explique, j'ai dèja de schedulé sur la runloop un timer qui conserve une connection ouverte (envoie d'une requête "KEEP_ALIVE" toutes les 15 secondes) en ouvrant un openPanel modal plus de 15 secondes, je perd ma connection (il bloque l'envoie de la requete) d'ou le non modal.

    facile en 10.6 legerement plus complexe en 10.5
  • AliGatorAliGator Membre, Modérateur
    13:00 modifié #13
    Ah bah s'il ne veut pas qu'il soit modal :
    - s'il veut qu'il soit en mode "sheet" ça sera retenu par la RunLoop
    - sinon c'est un NSPanel que tu veux manipuler et afficher à  l'écran, oui par contre il faut bien le retenir (tout comme quand tu crées une NSWindow, après tout un NSOpenPanel est un NSSavePanel qui est un NSPanel qui est une NSWindow...) le temps de l'afficher. Tu peux toujours utiliser la propriété "releasedWhenClosed" de NSWindow pour la relâcher automatiquement (case que tu peux cocher dans IB quand tu crées des NSPanel ou des NSWindow personnalisées, bah là  tu le fais par code sur le openPanel)
    Bon j'avoue c'est pas évident au premier abord je pense que je me serai fait avoir moi aussi. Mais au final c'est logique.

    Et d'après les conventions de nommage c'est normal que [NSOpenPanel openPanel] retourne un objet autoreleased.
  • cyranocyrano Membre
    mars 2011 modifié #14
    moi je m'attendai au release apres le choix de l'utilisateur (ok, cancel ou...)

    la logique des uns, n'est pas tjrs la logique des autres  :D

    conclusion:

    il faut un retain avant:

    - (void)beginForDirectory:(NSString *)absoluteDirectoryPath file:(NSString *)filename types:(NSArray *)fileTypes modelessDelegate:(id)modelessDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo

    et un release dans didEndSelector:::
  • CéroceCéroce Membre, Modérateur
    13:00 modifié #15
    dans 1300802376:

    je vous explique, j'ai dèja de schedulé sur la runloop un timer qui conserve une connection ouverte (envoie d'une requête "KEEP_ALIVE" toutes les 15 secondes) en ouvrant un openPanel modal plus de 15 secondes, je perd ma connection (il bloque l'envoie de la requete) d'ou le non modal.


    Le problème de ton approche, c'est que dès qu'un action dure plus de 15 secondes, on va perdre la connexion. Par exemple, on maintient le bouton de la souris appuyée (15 s, c'est long, mais ça peut arriver sur un NSSlider), on charge un gros fichier, etc.
    De fait, le keep alive devrait être effectué dans un deuxième thread. C'est plus compliqué, mais ça va t'éviter de bidouiller pour chaque situation qui bloque la run-loop.
  • cyranocyrano Membre
    13:00 modifié #16
    tu as raison  :D

    les threads j'en manipule autour de 500 dans mon application avec des synchronisations en plus ,d'ailleurs  j'ai bien d'autres histoires dessus (surement un peu ennuyeuses pour le forum) ;)
  • cyranocyrano Membre
    13:00 modifié #17
    dans 1300805755:

    tu as raison  :D


    au lieu de scheduler en NSDefaultRunLoopMode il faut choisir le mode NSRunLoopCommonModes et le tour est joué.

    merci, pour ton avertissement
Connectez-vous ou Inscrivez-vous pour répondre.