Quand disparait un NSOpenPanel ?

J'ai écrit une routine d'import de fichiers txt.



Je demande à  l'utilisateur de saisir le fichier à  importer via un NSOpenPanel et ensuite j'ouvre le fichier et je fais mon import.



Problème : le Panel de saisie reste présent jusqu'à  la fin de ma routine d'import. Pourquoi ? et comment y remédier ?



Voici un extrait du code :






[font=Menlo][size=3]<br />
[color=#3995ad]NSURL[/color] *file;[/size][/font]<br />
<br />
<br />
[font=Menlo][size=3]<br />
-([color=#103ffb]BOOL[/color])SaisirUnFichierImporter {[/size][/font][font=Menlo][size=3]<br />
    [/size][/font][font=Menlo][size=3]<br />
     [color=#3995ad]NSInteger[/color] result;[/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color]NSArray[color=#000000] *fileTypes = [[/color]NSArray[color=#000000] [/color]arrayWithObjects[color=#000000]:[/color][color=#df801e]@&quot;txt&quot;[/color][color=#000000], [/color][color=#df801e]@&quot;xyz&quot;[/color][color=#000000], [/color][color=#103ffb]nil[/color][color=#000000]];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color]NSOpenPanel[color=#000000] *monPanel = [[/color]NSOpenPanel[color=#000000] [/color]openPanel[color=#000000]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
    [monPanel [color=#3995ad]setAllowedFileTypes[/color]:fileTypes];[/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [monPanel [/color]setAllowsMultipleSelection[color=#000000]:[/color][color=#103ffb]NO[/color][color=#000000]];[/color][/size][/font][/color][color=#DF801E][font=Menlo][size=3]<br />
[color=#000000]    [monPanel [/color][color=#3995ad]setTitle[/color][color=#000000]:[/color]@&quot;Choose Document&quot;[color=#000000]];[/color][/size][/font][/color][color=#DF801E][font=Menlo][size=3]<br />
[color=#000000]    [monPanel [/color][color=#3995ad]setMessage[/color][color=#000000]:[/color]@&quot;Choose documents who contain points.&quot;[color=#000000]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
    [monPanel [color=#3995ad]setCanChooseFiles[/color]:[color=#103ffb]YES[/color]];[/size][/font][font=Menlo][size=3]<br />
    result = [monPanel [color=#3995ad]runModal[/color]];[/size][/font][font=Menlo][size=3]<br />
    [color=#103ffb]if[/color] (result==[color=#3995ad]NSOKButton[/color]) {[/size][/font][font=Menlo][size=3]<br />
        [color=#3995ad]file[/color] = [monPanel [color=#3995ad]URL[/color]];[/size][/font][font=Menlo][size=3]<br />
    }[/size][/font][font=Menlo][size=3]<br />
    [color=#103ffb]return[/color] (result==[color=#3995ad]NSOKButton[/color]);[/size][/font][font=Menlo][size=3]<br />
    [/size][/font]<br />
[font=Menlo][size=3]<br />
}[/size][/font]<br />
<br />
<br />
[font=Menlo][size=3]<br />
-([color=#103ffb]IBAction[/color])ImportePoints:([color=#103ffb]id[/color])sender {[/size][/font][font=Menlo][size=3]<br />
    [/size][/font][font=Menlo][size=3]<br />
     [/size][/font][font=Menlo][size=3]<br />
    [color=#3995ad]NSError[/color] *error;[/size][/font][font=Menlo][size=3]<br />
    [color=#3995ad]NSString[/color] *contenu;[/size][/font][font=Menlo][size=3]<br />
    [color=#3995ad]NSInteger[/color] unMatricule;[/size][/font][font=Menlo][size=3]<br />
    [color=#103ffb]double[/color] unX,unY,unZ;[/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color]NSData[color=#000000] *uneCouleur=[[/color]NSKeyedArchiver[color=#000000] [/color]archivedDataWithRootObject[color=#000000]:[/color]maGlobale[color=#000000].[/color]g_CouleurEnCours[color=#000000]];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color]NSNumber[color=#000000] *uneNature=[[/color]NSNumber[color=#000000] [/color]numberWithInt[color=#000000]:[/color][color=#2934d5]0[/color][color=#000000]];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color]Couche[color=#000000] *uneCouche=[[/color]managerCouches[color=#000000] [/color]ChercheCoucheAvecIndex[color=#000000]:[[/color]maGlobale[color=#000000] [/color]g_CoucheEnCours[color=#000000]]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
        [/size][/font][font=Menlo][size=3]<br />
    [/size][/font][font=Menlo][size=3]<br />
    [color=#3995ad]NSString[/color] *texteMatricules=[color=#df801e]@&quot;Divers points&quot;[/color];[/size][/font][font=Menlo][size=3]<br />
    [/size][/font][font=Menlo][size=3]<br />
    [/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]    [/color][color=#103ffb]if[/color][color=#000000] ([[/color][color=#103ffb]self[/color][color=#000000] [/color]SaisirUnFichierImporter[color=#000000]]) {[/color][/size][/font][/color][font=Menlo][size=3]<br />
        [/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        [[/color]NSApp[color=#000000] [/color]beginSheet[color=#000000]: [[/color][color=#103ffb]self[/color][color=#000000] [/color]monProgressSheet[color=#000000]][/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]           [/color]modalForWindow[color=#000000]: [[/color][color=#103ffb]self[/color][color=#000000] [/color]maFenetre[color=#000000]][/color][/size][/font][/color][font=Menlo][size=3]<br />
            [color=#3995ad]modalDelegate[/color]: [color=#103ffb]self[/color][/size][/font][font=Menlo][size=3]<br />
           [color=#3995ad]didEndSelector[/color]: [color=#103ffb]@selector[/color](didEndSheet:returnCode:contextInfo:)[/size][/font][font=Menlo][size=3]<br />
              [color=#3995ad]contextInfo[/color]: [color=#103ffb]nil[/color]];[/size][/font]<br />
[font=Menlo][size=3]<br />
        [/size][/font][font=Menlo][size=3]<br />
        [/size][/font][font=Menlo][size=3]<br />
        [/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        contenu=[[/color]NSString[color=#000000] [/color]stringWithContentsOfURL[color=#000000]:[/color]file[color=#000000] [/color]encoding[color=#000000]:[/color][color=#2934d5]1[/color][color=#000000] [/color]error[color=#000000]:&amp;error];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        [/color]NSArray[color=#000000] *untab=[contenu [/color]componentsSeparatedByString[color=#000000]:[/color][color=#df801e]@&quot;&#092;n&quot;[/color][color=#000000]];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        [[[/color][color=#103ffb]self[/color][color=#000000] [/color]monProgressIndicator[color=#000000]] [/color]setMaxValue[color=#000000]:[untab [/color]count[color=#000000]]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
        [/size][/font][font=Menlo][size=3]<br />
        [color=#103ffb]double[/color] index=[color=#2934d5]0[/color];[/size][/font][font=Menlo][size=3]<br />
        [/size][/font][font=Menlo][size=3]<br />
        [color=#3995ad]NSString[/color] *unPoint;[/size][/font][font=Menlo][size=3]<br />
        [color=#103ffb]for[/color] (unPoint [color=#103ffb]in[/color] untab) {[/size][/font][font=Menlo][size=3]<br />
            index++;[/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]            [[[/color][color=#103ffb]self[/color][color=#000000] [/color]monProgressIndicator[color=#000000]] [/color]setDoubleValue[color=#000000]:index];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]            [/color]NSScanner[color=#000000] *unScanner=[[/color]NSScanner[color=#000000] [/color]localizedScannerWithString[color=#000000]:unPoint];[/color][/size][/font][/color][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]            [unScanner [/color]setCharactersToBeSkipped[color=#000000]:[[/color]NSCharacterSet[color=#000000] [/color]whitespaceCharacterSet[color=#000000]]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
            [color=#103ffb]if[/color] (([unScanner [color=#3995ad]scanInteger[/color]:&amp;unMatricule])&amp;([unScanner [color=#3995ad]scanDouble[/color]:&amp;unX])&amp;([unScanner [color=#3995ad]scanDouble[/color]:&amp;unY])) {[/size][/font][font=Menlo][size=3]<br />
                [color=#103ffb]if[/color] (&#33;[unScanner [color=#3995ad]scanDouble[/color]:&amp;unZ]) {unZ=[color=#2934d5]0.00[/color];}[/size][/font][font=Menlo][size=3]<br />
                [[color=#103ffb]self[/color] [color=#3995ad]StockeUnNumero[/color]:unMatricule [color=#3995ad]avecX[/color]:unX [color=#3995ad]etY[/color]:unY [color=#3995ad]etZ[/color]:unZ [color=#3995ad]etLaCouche[/color]:uneCouche [color=#3995ad]etLaCouleur[/color]:uneCouleur [color=#3995ad]etLaNature[/color]:uneNature];[/size][/font][color=#D22114][font=Menlo][size=3]<br />
//                if ([texteMatricules isNotEqualTo:@&quot;&quot;]) {[/size][/font][/color][color=#D22114][font=Menlo][size=3]<br />
//                    texteMatricules=[texteMatricules stringByAppendingFormat:@&quot; ; %ld&quot;,(long)unMatricule]; }[/size][/font][/color][color=#D22114][font=Menlo][size=3]<br />
//                else {[/size][/font][/color][color=#D22114][font=Menlo][size=3]<br />
//                   texteMatricules=[texteMatricules stringByAppendingFormat:@&quot;%ld&quot;,(long)unMatricule]; }[/size][/font][/color][font=Menlo][size=3]<br />
            }[/size][/font][font=Menlo][size=3]<br />
         }[/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        [[/color]mesResultats[color=#000000] [/color]AjouteResultat[color=#000000]:[/color][color=#df801e]@&quot;Import points&quot;[/color][color=#000000] [/color]avecDetail[color=#000000]:texteMatricules [/color]avecTemps[color=#000000]:[[/color]NSDate[color=#000000] [/color]date[color=#000000]]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
        }[/size][/font][font=Menlo][size=3]<br />
    [/size][/font][color=#3995AD][font=Menlo][size=3]<br />
[color=#000000]        [[[/color][color=#103ffb]self[/color][color=#000000] [/color]monProgressSheet[color=#000000]] [/color]orderOut[color=#000000]:[/color][color=#103ffb]self[/color][color=#000000]];[/color][/size][/font][/color][font=Menlo][size=3]<br />
    }[/size][/font]<br />
<br />

Réponses

  • KubernanKubernan Membre
    août 2012 modifié #2
    Fait longtemps que j'ai pas mis les pieds dans OS X mais j'imagine que ton import devrait se réaliser dans un thread séparé pour librérer l'interface utilisateur.
  • psychoh13psychoh13 Mothership Developer Membre
    Déjà  respecte les conventions de nommage, les noms des méthodes doivent commencer avec une minuscule.



    Ensuite, le panneau se fermera quand le runloop aura une chance de bosser à  nouveau c'est-à -dire à  la fin de ta méthode. Tu peux soit exécuter une méthode de manière asynchrone, en utilisant performSelector:withObject:afterDelay: ou en l'exécutant sur une thread séparée.
  • Bonjour;



    Tu peux essayer de détruire ton monPanel vu qu'il ne sert plus


    <br />
    result = [monPanel runModal];<br />
    	if (result==NSOKButton) {<br />
    		file = [monPanel URL];<br />
      <br />
    [monPanel release];<br />
    }<br />
    
  • psychoh13,







    Merci du conseil. Je décompose en deux phases :


    1 - appel du OpenPanel

    2 - si la réponse est validée je poste un appel au traitement de l'import par un performSelector avec un délai > à  0 sinon le runloop n'a pas le temps de masquer le OpenPanel.




    Autre détail : j'utilise une sheet avec un NSProgressIndicator pour l'import. Tout va bien si ce n'est que j'essaie de lui donner une teint Aqua avec setControlTint:NSBlueControlTint et j'obtiens irrémédiablement une teinte grise. une idée ?



    Quant aux noms de méthodes je suis en cours de normalisation (merci pour le rappel).
  • mpergandmpergand Membre
    août 2012 modifié #6
    'fleurantin' a écrit:
    Autre détail : j'utilise une sheet avec un NSProgressIndicator pour l'import. Tout va bien si ce n'est que j'essaie de lui donner une teint Aqua avec setControlTint:NSBlueControlTint et j'obtiens irrémédiablement une teinte grise. une idée ?




    La solution se trouve juste au-dessus image/laugh.png' class='bbc_emoticon' alt=':lol:' />
    [...] un performSelector avec un délai > à  0 sinon le runloop n'a pas le temps [...]
  • AliGatorAliGator Membre, Modérateur
    Puisque tu utilises un NSProgressIndicator, je suppose que ton traitement prend un peu de temps (c'est pour ça que tu veux montrer à  l'utilisateur la progression de ce traitement, et c'est très bien).



    Donc du coup la solution n'est pas le performSelector avec un délai, qui ne fera qu'appeler ta méthode à  la prochaine itération de la RunLoop, mais toujours sur le MainThread qui du coup sera bloqué pendant toute l'exécution de ladite méthode de traitement et n'aura donc pas le temps de rafraà®chir l'interface.

    Mais la solution est de faire ton traitement en asynchrone, en tâche de fond, dans un thread séparé.



    Le plus simple pour faire cela est certainement GCD. Ou à  la limite les NSOperationQueues.

    Je t'invite à  lire le Concurrency Programming Guide d'Apple qui va t'indiquer les différentes technologies pour faire des tâches concurrentes (= en parallèle / en tâche de fond) sans bloquer ton thread principal. Il y a également toute une session de la WWDC'12 (disponible en vidéo sur ton compte développeur) qui explique quelques concepts (bon de mémoire la vidéo est orientée iPhone, mais les principes sont les mêmes sous OSX)
Connectez-vous ou Inscrivez-vous pour répondre.