Frage

Ich verwende eine OpenPanel einen Dateipfad URL zu erhalten. Dies funktioniert:

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

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

Dies gilt nicht, was zu einer ‚Zuordnung von Nur-Lese-Variable‘ Fehler:

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

In der Regel wird jeder Versuch, zu extrahieren pathToFile aus dem Kontext des Opañel ist fehlgeschlagen. Das ist nicht so eine große Sache für kleine Situationen, aber wie mein Code wächst, ich bin zu stopfen alles gezwungen - XML-Parsing, Kerndaten, etc. - innerhalb einer unangemessenen Region. Was kann ich tun pathToFile zu extrahieren?

Danke.

War es hilfreich?

Lösung

  

Dies gilt nicht, was zu einer ‚Zuordnung von Nur-Lese-Variable‘ Fehler:

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

Ja, weil Sie versuchen, die Kopie der pathToFile Variablen zugewiesen werden, die vorgenommen wird, wenn der Block erstellt wird. Sie sind nicht auf die ursprüngliche pathToFile Variablen zugewiesen wird, dass Sie außerhalb des Blocks erklärt.

Sie könnten die __block Schlüsselwort den Block assign auf diese Variable zu lassen, aber ich glaube nicht, dies wird dazu beitragen, weil beginSheetModalForWindow:completionHandler: nicht blockiert. (Die Dokumentation dieses nicht erwähnt, aber es gibt keinen Grund für das Verfahren zu Block, und Sie können mit der Protokollierung überprüfen, ob es funktioniert nicht.) Die Meldung kehrt sofort, während die Platte noch ausgeführt wird.

Also, Sie versuchen, Ihren Abschluss-Hantierungsbausteins assign zu einer lokalen Variablen zu haben, aber Ihre Methode, bei der Sie die lokalen Variable deklariert wird wahrscheinlich von dem Zeitblock Läufen zurückgeführt haben, so dass es nicht in der Lage sein wird, mit dem Wert der Arbeit, dass der Block links wird in den variablen lassen.

Was auch immer Sie mit pathToFile tun sollten entweder im Block selbst oder in einem Verfahren (unter ein NSURL * Argument), dass der Block aufrufen können.

Andere Tipps

Sie können auch runModal, nachdem Sie das Blatt beginnen Sie müssen nur sicherstellen, dass Sie das Blatt enden später. Auf diese Weise müssen Sie Willen nicht beugen zu Apfel, ist es nicht veraltet ist und es sollte immer noch perfekt funktionieren.

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];

Es scheint ein wenig wie schwarze Magie Codierung, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top