4

ユーザーが NSWindowController の赤い閉じるボタンをクリックしたときにモーダルを停止したい。

NSWindowController には、「OK」と「キャンセル」ボタンがあります。

- (IBAction)okButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSOKButton];
    [self.window close];
}

- (IBAction)cancelButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSCancelButton];
    [self.window close];
}

赤い閉じるボタンをクリックすると、ウィンドウが閉じてモーダルが止まりません。windowWillClose:関数を見つけました。

- (void)windowWillClose:(NSNotification *)notification
{
    if ([NSApp modalWindow] == self.window)
        [NSApp stopModal];
}

でも、

if ([NSApp runModalForWindow:myWindowController.window] != NSOKButton)
    return;

OKボタンをクリックしてもwindowWillClose:関数が呼び出され、runModalForWindow:関数は常にNSCancelButtonを返します。

モーダルの結果として、メンバー変数をmyWindowControllerに追加できます。

しかし、この問題を解決する別の一般的な方法があると思います。

楽な道を歩みたい。

4

3 に答える 3

4

少し遅いかもしれませんが、自分で答えを見つけようとしてこの質問を見つけました。そして、それは公式ドキュメントで言われていることです: - (BOOL)windowShouldClose:(id)sender[window close] でウィンドウを閉じたときに呼び出されないイベントハンドラーがあります。赤い閉じるボタンまたは [window performClose:] セレクターを使用した場合にのみ呼び出されます。したがって、解決策は、NSWindowController サブクラスwindowShouldClose:の代わりに実装することです。windowWillClose:

于 2014-03-05T02:25:36.170 に答える
3

このように試すことができます

- (IBAction)okButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSOKButton];
    [NSApp endSheet:self.window];
}

- (IBAction)cancelButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSCancelButton];
    [NSApp endSheet:self.window];
}
于 2012-12-04T04:25:00.633 に答える
2

NSapplication Class Referenceによると 、NSApplication の endSheet: メソッドは 10.10 (Mavericks) で非推奨になります。Apple は NSWindow beginSheet: および endSheet: メソッドの使用を推奨しているため、NSWindowController サブクラス内から NSWindowController を却下しようとしている場合は、このコード スニペットを使用する必要があります。

[self.window.sheetParent endSheet:self.window];

NSWindow のsheetParentプロパティを使用してendSheet:を呼び出し、サブクラスのウィンドウを引数として渡します。戻りコードを指定したい場合は、NSWindow の endSheet: returnCode: を使用することもできます。OSX 10.9 / XCode 6.1.1 でテスト済み

于 2015-02-05T20:26:17.790 に答える