SDK 10.10で状況が変更されました。呼び出しは、理解しやすいと思います。親ウィンドウは、子NSWindowをシートとして起動する役割を果たします。次に、この子NSWindowをNSAppに渡して、モーダルで実行します。次に、逆の操作を行ってアンラップします。
表示シート
呼び出す代わりにシートを表示するには:
[NSApp beginSheet:theSheet
modalForWindow:(NSWindow *)_window
modalDelegate:self
didEndSelector:nil
contextInfo:nil];
ここで、親ウィンドウを呼び出します。
(void)beginSheet:(NSWindow *)sheetWindow
completionHandler:(void (^)(NSModalResponse returnCode))handler
そして、モーダルループのようにシートを実行するには、次のコマンドでNSAppを呼び出す必要もあります。
- (NSInteger)runModalForWindow:(NSWindow *)aWindow
クロージングシート
シートを閉じるには、親ウィンドウを呼び出します。
- (void)endSheet:(NSWindow *)sheetWindow
これにより、上記の呼び出しからのcompleteHandlerが起動します。ここで、次のコマンドを使用してNSAppを呼び出すことにより、モーダルウィンドウの実行を停止する呼び出しを行うことができます。
- (void)stopModalWithCode:(NSInteger)returnCode
完全な例
@implementation AppDelegate
@synthesize window = _window;
- (IBAction) showTheSheet:(id)sender {
[_window beginSheet: theSheet
completionHandler:^(NSModalResponse returnCode) {
[NSApp stopModalWithCode: returnCode];
}];
[NSApp runModalForWindow: theSheet];
}
-(IBAction)endTheSheet:(id)sender {
[_window endSheet: theSheet];
}
@end