7

NSPanel をシートとして表示しようとしています。私は素朴にそれらの線に沿って何かをしています:

SheetController *sheetController = [[[SheetController alloc]
                                      initWithWindowNibName:@"Sheet"] autorelease];

[[NSApplication sharedApplication] beginSheet:sheetController.window 
                               modalForWindow:self.window
                                modalDelegate:self
                               didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) 
                                  contextInfo:nil];

私を逃れる何らかの理由で、これは機能していません。コードのこの部分が呼び出されると、(autoreleaseメッセージのため) シートが一瞬点滅します。シートが窓に引っかかることはありません。

誰かが私がより多くの情報を見つけることができる場所を教えてくれるなら、それは非常にありがたいです.

4

3 に答える 3

17

これは、IB でパネルの [起動時に表示] ボックスをオンにした典型的なケースのように思えます。それをオフにします。

于 2009-09-22T09:28:56.873 に答える
2

はい、機能を継続したい限り、このコントローラーを所有する必要があります。単に作成して自動リリースし、それを死なせることはできません。必要な限り、それを保持する必要があります。

于 2009-09-22T02:31:09.497 に答える
1

これを「モーダル」シートとして実行しようとしている場合 (つまり、ユーザーが閉じるまでアプリを引き継ぎます)、新しい実行ループをプッシュする必要があることを忘れないでください。

あなたが行ったことは、シートを表示し、新しいループをプッシュしないため、OS はシートを表示するだけで、シートを実行し続ける理由がないことを確認し、シャットダウンして次の行で実行を再開します。

私は通常、次の方法でシートを作成します。

- (id)showPanelModalAgainstWindow: (NSWindow *)window
{
   [[NSApplication sharedApplication] beginSheet: panelToShow
                modalForWindow: window
                modalDelegate: self
                didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
                contextInfo: nil];

   [[NSApplication sharedApplication] runModalForWindow: panelToShow];
   if (m_returnCode == NSCancelButton) return nil;
}


- (void)sheetDidEnd:(NSWindow *)sheet
         returnCode:(int)returnCode
        contextInfo:(void  *)contextInfo
{
    UNUSED(sheet);
    UNUSED(contextInfo);
    m_returnCode = returnCode;
}

次に、同意および/またはキャンセルボタンのルーチンで:

- (IBAction)continueButtonClicked:(id)sender
{
    UNUSED(sender);
    [[NSApplication sharedApplication] stopModal];
    [createAccountWizardPanel orderOut: nil];
    [[NSApplication sharedApplication] endSheet: createAccountWizardPanel
                                       returnCode: NSOKButton];

}

これを行うためのコードの少ない方法があると確信していますが、これまでのところ、この方法は完全にうまく機能するため、深く調べていません....

コントローラーとパネル オブジェクトの有効期間に関する以前のコメントも関連しています。モーダル パネルを表示するときに、どのオブジェクトがどの有効期間に必要なのかを正確に理解してください。

于 2009-09-22T16:24:31.637 に答える