Obtendo URL de BeginSheetModalForWindow:
-
24-09-2019 - |
Pergunta
Estou usando um OpenPanel para obter um URL do caminho do arquivo. Isso funciona:
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
NSURL *pathToFile = nil;
if (returnCode == NSOKButton)
pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
Isso não, resultando em uma 'atribuição de variável somente leitura'.
NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
if (returnCode == NSOKButton)
pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;
Em geral, qualquer tentativa de extrair Pathtofile do contexto da Opanel falhou. Isso não é tão importante para pequenas situações, mas à medida que meu código cresce, sou forçado a encher tudo - análise XML, dados principais, etc - dentro de uma região inadequada. O que posso fazer para extrair o Pathtofile?
Obrigado.
Solução
Isso não, resultando em uma 'atribuição de variável somente leitura'.
NSURL *pathToFile = nil; [oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode) { if (returnCode == NSOKButton) pathToFile = [[oPanel URLs] objectAtIndex:0]; }]; return pathToFile;
Sim, porque você está tentando atribuir à cópia do pathToFile
variável que é feita quando o bloco é criado. Você não está atribuindo ao original pathToFile
variável que você declarou fora do bloco.
Você poderia usar a __block
palavra -chave para deixar o bloco atribuir a essa variável, mas não acho que isso ajude porque beginSheetModalForWindow:completionHandler:
não bloqueia. (A documentação não menciona isso, mas não há razão para o método bloquear e você pode verificar com o log que não.) A mensagem retorna imediatamente, enquanto o painel ainda está em execução.
Então, você está tentando atribuir seu bloco de conclusão a uma variável local, mas seu método no qual você declarou que a variável local provavelmente retornará nas execuções do bloco de tempo, para que não seja capaz de trabalhar com o valor que o bloco deixei sairá na variável.
O que quer que você faça com pathToFile
deve estar no próprio bloco ou em um método (tomando um NSURL *
argumento) que o bloco pode ligar.
Outras dicas
Você também pode ser executado depois de iniciar a folha, só precisa terminar a folha mais tarde. Dessa forma, você não precisa se curvar à vontade da Apple, ela não está depreciada e ainda deve funcionar perfeitamente.
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];
Parece um pouco com a codificação da magia negra, mas funciona.