[resolu] 10.5 NSOpenPanel non modal
cyrano
Membre
bonsoir,
peut on avoir un openPanel 10.5 non modal?
en 10.6 je fais
que dois je utiliser en 10.5 ?
peut on avoir un openPanel 10.5 non modal?
en 10.6 je fais
<br /> [openPanel beginWithCompletionHandler:^(NSInteger returnCode) {<br /> if(returnCode == NSFileHandlingPanelOKButton) {<br /> [theZoo startScript:[[openPanel URLs] lastObject]];<br /> }<br /> }];<br />
que dois je utiliser en 10.5 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ?
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 ?
au cycle suivant il n'existe plus, bien que je ne l'ai pas fermé (c'est ce comportement que je trouve illogique).
cf le Programming Topic dédié "Using Application-Modal Dialogs" dans la doc
@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.
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.
facile en 10.6 legerement plus complexe en 10.5
- 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.
la logique des uns, n'est pas tjrs la logique des autres
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:::
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.
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)
au lieu de scheduler en NSDefaultRunLoopMode il faut choisir le mode NSRunLoopCommonModes et le tour est joué.
merci, pour ton avertissement