4

OpenPanel を使用してファイル パス URL を取得しています。これは機能します:

[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 を抽出するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

6

これは行われず、「読み取り専用変数の割り当て」エラーが発生します。

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

pathToFileはい、ブロックの作成時に作成される変数のコピーに割り当てようとしているためです。pathToFileブロック外で宣言した元の変数に割り当てていません。

キーワードを使用__blockてブロックをこの変数に割り当てることもできますが、ブロックされないため、これが役立つとは思いbeginSheetModalForWindow:completionHandler:ません。(ドキュメントにはこれについては記載されていませんが、メソッドがブロックされる理由はなく、ブロックされていないことをログで確認できます。)パネルの実行中にメッセージがすぐに返されます。

したがって、completion-handlerブロックをローカル変数に割り当てようとしていますが、ローカル変数を宣言したメソッドは、ブロックの実行時までに返される可能性があるため、ブロックの値変数に残します。

何をするにしてpathToFileも、ブロック自体、またはNSURL *ブロックが呼び出すことができるメソッド(引数を取る)のいずれかにある必要があります。

于 2010-02-02T06:04:03.273 に答える
1

シートを開始した後に Modal を実行することもできます。後でシートを終了することを確認する必要があります。この方法では、アップルの意志に屈する必要はありません。非推奨ではなく、完全に機能するはずです。

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

黒魔術のコーディングに少し似ていますが、機能します。

于 2012-04-05T04:06:31.180 に答える