Question

J'utilise un openPanel pour obtenir une URL de chemin de fichier. Cela fonctionne:

[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 NSURL *pathToFile = nil;

 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];

Cela ne, entraînant une « cession de lecture seule variable » erreur:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

En général, toute tentative d'extraire PathToFile du contexte de Opañel a échoué. Ce n'est pas un gros problème pour les petites situations, mais mon code grandit, je suis obligé d'y mettre tout - l'analyse syntaxique XML, les données de base, etc - dans une région inappropriée. Que puis-je faire pour extraire PathToFile?

Merci.

Était-ce utile?

La solution

  

Cela ne résulte d'une « cession de lecture seule variable » erreur:

NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
 if (returnCode == NSOKButton)
     pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;

Oui, parce que vous essayez d'attribuer à la copie de la variable pathToFile qui obtient fait lorsque le bloc est créé. Vous n'êtes pas attribuer à la variable pathToFile d'origine que vous avez déclaré en dehors du bloc.

Vous pouvez utiliser le mot-clé __block pour laisser le bloc à cette variable attribuer, mais je ne pense pas que cela vous aidera, car beginSheetModalForWindow:completionHandler: ne bloque pas. (La documentation ne mentionne pas, mais il n'y a aucune raison pour que la méthode pour bloquer, et vous pouvez vérifier avec la connexion qu'il ne fonctionne pas.) Le message retourne immédiatement, alors que le panneau est toujours en cours d'exécution.

Alors, vous essayez d'avoir votre bloc fin-gestionnaire assigner à une variable locale, mais votre méthode dans laquelle vous déclarez la variable locale aurez probablement renvoyée par les pistes de bloc de temps, donc il ne sera pas en mesure de travailler avec la valeur que le bloc gauche laissera dans la variable.

Tout ce que vous faites avec pathToFile doit être soit dans le bloc lui-même, ou dans une méthode (en tenant un argument NSURL *) que le bloc peut appeler.

Autres conseils

vous pouvez également runModal après avoir commencé la feuille que vous avez juste besoin de vous assurer que vous finissez la feuille plus tard. De cette façon, vous n'avez pas à se plier à la volonté de la pomme, il n'est pas dépréciée et il devrait encore fonctionner parfaitement.

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:window completionHandler:nil];
NSInteger result = [openPanel runModal];
NSURL *url = nil;
if (result == NSFileHandlingPanelOKButton) 
{
    url = [openPanel URL];
}
[NSApp endSheet:openPanel];

Il semble un peu comme le codage de la magie noire, mais il fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top