- (IBAction)accountButtonPressed:(id)sender {
[NSApp beginSheet:self.accountSheet
modalForWindow:[mainWindowView window]
modalDelegate:nil
didEndSelector:nil
contextInfo:nil];
[NSApp runModalForWindow:self.accountSheet];
[NSApp endSheet:self.accountSheet];
[self.accountSheet orderOut:self];
}
うわー、それを見ると、スクリーンショットがそのままのように見えても不思議ではありません。
一度に 1 行ずつ見ていきましょう。[アカウント] ボタンをクリックすると、次の 4 つのことがすぐに連続して実行されます。
メイン ウィンドウに添付されたシートの表示を開始するようにアプリケーションに指示しています。これで問題ありません。実際にそのaccountButtonPressed:
メソッドで必要なコードはこれだけです。
そのシートを開始した直後に、アプリケーション モーダルな方法で、そのシートを単独で (どのウィンドウにも接続せずに画面の真ん中に) 表示したいことをアプリケーションに伝えます。これにより、他のすべてのイベントがブロックされます。アプリケーションで処理されます。つまり、この行はあまり意味がありません。ウィンドウを「ドキュメント モーダル」方式 (シートがアタッチされているウィンドウのみを結合する) または「アプリケーション モーダル」方式でシートとして表示しますが、両方を同時に表示することはできません。;-)
シートを表示した直後に、シートのNSApp
表示を停止するように指示します。最終的にはこれを行いたいと思いますが、シートを表示してから 0.0005 秒後にシートを閉じると、ユーザーは少しイライラする可能性があります。
ここで、シート自体を非表示にするように指示します。これはあなたの方法から行う必要がありdidEndSelector:
、最初の方法の問題につながります。
-
[NSApp beginSheet:self.accountSheet
modalForWindow:[mainWindowView window]
modalDelegate:nil
didEndSelector:nil
contextInfo:nil];
これは良いことですが、 ドキュメントとSheet Programming Topics: Using Custom SheetsbeginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
も読んでください。(クラス リファレンス ページの上部にあるコンパニオン ガイドのリンクは、実際に API を使用する方法を学習するのに特に役立ちます。これらは、私が学習していたときに非常に役立ちました)。
を指定nil
するとmodalDelegate:
、シートが表示されなくなったときに通知されるのを待っているものは何もありません (これは、 を呼び出したときに発生します[NSApp endSheet:sheet]
)。@selector
また、シートが終了したときに呼び出す を指定していません。セレクターは関数のようなもので、別名「メソッド」です。
コードは次のようになります。
@implementation MDAppDelegate
- (IBAction)showSheet:(id)sender {
[NSApp beginSheet:self.sheet
modalForWindow:self.window
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo:NULL];
}
- (IBAction)cancel:(id)sender {
[NSApp endSheet:self.sheet];
}
- (IBAction)ok:(id)sender {
[NSApp endSheet:self.sheet];
}
- (void)sheetDidEnd:(NSWindow *)sheet
returnCode:(NSInteger)returnCode
contextInfo:(void *)contextInfo {
[sheet orderOut:nil];
}
@end
この例では、[シートを表示] ボタンをクリックすると、メイン ウィンドウに添付されたシートが表示され始めます。シートには、[キャンセル] ボタンと [OK] ボタンがあり、どちらもそれぞれのメソッドを呼び出します。これらの各メソッドで、 を呼び出します[NSApp endSheet:self.sheet]
。これは、モーダル デリゲートとして指定されたオブジェクトNSApp
のメソッドを呼び出す必要があることを示しています。次に、シート自体を非表示にするように指示しますsheetDidEnd:returnCode:contextInfo:
。sheetDidEnd:returnCode:contextInfo:
編集:
すべてNSWindow
に、Interface Builder で設定できる「起動時に表示」フラグがあります。このフラグが設定されている場合、nib ファイルがロードされたときにウィンドウが表示されます。設定されていない場合、プログラムで表示するまでウィンドウは非表示になります。次のように nib ファイルのフラグを編集するだけです。
