2

アプリケーションでカスタムシートを表示しようとしていますが、何か問題があると思います。すべてがうまく機能しているように見えますが、私にはかなり奇妙な副作用があります。(理解するのに何時間もかかりました)。アプリケーションでシートを表示するたびに、アプリケーションデリゲートがシートのインスタンスに設定されるため、コントローラーがデリゲートとして設定解除され、あらゆる種類の問題が発生することがわかりました。

FailureSheet.xibというNIBファイルを作成しました。インターフェイスをIBにレイアウトし、ファイルの所有者に設定した「FailureSheet.m」という「NSWindowController」のサブクラスを作成しました。これが私のFailureSheetクラスです。

#import "FailureSheet.h"

@implementation FailureSheet  // extends NSWindowController

- (id)init
{
    if (self = [super initWithWindowNibName:@"FailureSheet" owner:self])
    {

    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (IBAction)closeSheetTryAgain:(id)sender
{   
    [NSApp endSheet:[self window] returnCode:1];
    [[self window] orderOut:nil];
}

- (IBAction)closeSheetCancel:(id)sender
{
    [NSApp endSheet:[self window] returnCode:0];
    [[self window] orderOut:nil];
}

- (IBAction)closeSheetCancelAll:(id)sender
{
    [NSApp endSheet:[self window] returnCode:-1];
    [[self window] orderOut:nil];
}

@end

ここでは複雑なことは何も起こっていません。これが、「Controller」クラスにFailureSheetを表示する方法です。

sheet = [[FailureSheet alloc] init];

[NSApp beginSheet:[sheet window]
   modalForWindow:window
    modalDelegate:self
   didEndSelector:@selector(failureSheetDidEnd:etc:etc:)
      contextInfo:nil];

シートを表示する前に[NSAppデリゲート]をログに記録すると、正しいのは<Controller-0x012345>です。次に、このコードを実行してシートがアップした後、再度ログに記録すると、<FailureSheet-0xABCDEF>になります。

私がここで何を間違っているのかわからない-何かアイデアはありますか?

4

1 に答える 1

5

これは、「私はばかだ」という答えの1つです。

ある時点で、シートのNIBファイルで、アプリケーションとファイルの所有者(FailureSheet)の間で誤って接続を確立し、それをデリゲートとして設定したことが判明しました。そのため、ロードされるたびに、MainMenuNIBファイルにある既存のデリゲート接続が上書きされました。

于 2010-03-17T15:35:41.750 に答える