Quand disparait un NSOpenPanel ?
fleurantin
Membre
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 :
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]@"txt"[/color][color=#000000], [/color][color=#df801e]@"xyz"[/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]@"Choose Document"[color=#000000]];[/color][/size][/font][/color][color=#DF801E][font=Menlo][size=3]<br />
[color=#000000] [monPanel [/color][color=#3995ad]setMessage[/color][color=#000000]:[/color]@"Choose documents who contain points."[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]@"Divers points"[/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]:&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]@"\n"[/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]:&unMatricule])&([unScanner [color=#3995ad]scanDouble[/color]:&unX])&([unScanner [color=#3995ad]scanDouble[/color]:&unY])) {[/size][/font][font=Menlo][size=3]<br />
[color=#103ffb]if[/color] (![unScanner [color=#3995ad]scanDouble[/color]:&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:@""]) {[/size][/font][/color][color=#D22114][font=Menlo][size=3]<br />
// texteMatricules=[texteMatricules stringByAppendingFormat:@" ; %ld",(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:@"%ld",(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]@"Import points"[/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 />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
Tu peux essayer de détruire ton monPanel vu qu'il ne sert plus
Merci du conseil. Je décompose en deux phases :
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).
La solution se trouve juste au-dessus /laugh.png' class='bbc_emoticon' alt='' />
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)