NSOpenPanelがあり、ユーザーが[OK]をクリックした後、選択の検証を行いたいと思います。私のコードは単純です:
void (^openPanelHandler)(NSInteger) = ^(NSInteger returnCode) {
if (returnCode == NSFileHandlingPanelOKButton) {
// do my validation
[self presentError:error]; // uh oh, something bad happened
}
}
[openPanel beginSheetModalForWindow:[self window]
completionHandler:openPanelHandler];
[self window]
アプリケーションモーダルウィンドウです。パネルがシートとして開きます。ここまでは順調ですね。
Appleのドキュメントによると、完了ハンドラーは「ユーザーがパネルを閉じた後に」呼び出されることになっています。しかし、私の場合は、パネルが閉じたときではなく、「OK/キャンセル」ボタンを押すとすぐに呼び出されます。これにより、パネルが閉じた後ではなく、開いているパネルの上でエラーアラートが開きます。それでも動作しますが、Macのようなものではありません。
ユーザーが[OK]をクリックし、開いているパネルシートを折りたたんでから、アラートシートを表示することをお勧めします。
遅延セレクターを使用してアラートを表示できると思いますが、それはハックのようです。