質問

私は、ファイルパスのURLを取得するためにOpenPanelを使用しています。この作品ます:

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

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

これしない、エラー「読み取り専用変数の割り当て」をもたらす:

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

は一般的に、oPanelのコンテキストからpathToFileを抽出する任意の試みは失敗しました。これは、小規模な状況のため、このような大したことではありませんが、私のコードが大きくなるにつれて、私はスタッフすべてに強制しています - XML解析、コアデータなど - 不適切な領域の内側。私はpathToFileを抽出するために何ができるでしょうか。

感謝します。

役に立ちましたか?

解決

  

これしない、エラー「読み取り専用変数の割り当て」をもたらす:

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

はい、あなたはブロックが作成されたときに行われますpathToFile変数のコピーに割り当てるしようとしているので。あなたがブロックの外側で宣言した元pathToFile変数に代入していない。

あなたは __blockキーワードこの変数へのブロックの割り当てをできるように、私はbeginSheetModalForWindow:completionHandler:がブロックされていないため、この意志の助けを考えていません。 (ドキュメントはこのことを言及したが、ブロックへの方法には理由がない、とあなたはそれがないことをログで確認することができません。)メッセージに戻り、すぐに、パネルがまだ実行されている一方でます。

それはすることができなくなりますので、

だから、あなたは、ローカル変数へのあなたの完了ハンドラブロックを割り当てていますが、おそらく時間ブロックの実行によって返されていますローカル変数を宣言するあなたの方法を持ってしようとしています値との仕事は、ブロックが<デル>左変数に残すこと。

どのようなあなたがpathToFileを行うブロックが呼び出すことができること(NSURL *引数を取る)ブロック自体で、または方法のいずれかである必要があります。

他のヒント

あなたはちょうどあなたが後でシートを終わらせるようにする必要があり、シートを開始した後、

あなたがすることもできrunModal。この方法は、あなたがそれは廃止されていない、Appleの意志を曲げる必要はありませんし、それはまだ完璧に動作するはずです。

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

これは少しコーディング黒魔術のように思えるが、それは作業を行います。

scroll top