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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top