1

Cocoa を使用してマルチドキュメント アプリケーションを作成しています。ユーザーはドキュメントを開くときにパスワードを入力する必要があります。ドキュメントでの操作がない状態が一定時間続くと、ユーザーはもう一度パスワードの入力を求められます。

現在、カスタム シートにパスワード プロンプトを表示するためにNSAplication'sを使用しています。beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:これは動作しますが、別のドキュメントが同時に作業されている場合でも、ウィンドウが最前面に移動され、フォーカスが与えられるという不幸な副作用があります。私のアプリケーションが前面にある場合にのみ問題になります。

親ウィンドウがアクティブでない場合に、シートを開いてフォーカスを奪わないようにする方法はありますか?

4

1 に答える 1

0

簡単な方法はありません。ハックな方法は、ドキュメントのウィンドウとシートのウィンドウの両方に対して NSWindow のサブクラスを作成し、そのクラスで orderFront: と makeKeyWindow の両方をオーバーライドして、beginSheet を呼び出している間は何もしないようにすることです。例えば、

NSWindow サブクラスでは:

-(void)awakeFromNib
{
    hack = NO;
}

-(void)hackOnHackOff:(BOOL)foo
{
    hack = foo;
}

- (void)orderFront:(id)sender
{
    if (!hack)
        [super orderFront:sender];
}

- (void)makeKeyWindow
{
    if (!hack)
        [super makeKeyWindow];
}

そして、beginSheet 呼び出しは次のようになります。

-(void)sheet
{
    SpecialSheetWindow* documentWindow = [self windowForSheet];
    [documentWindow hackOnHackOff:YES];
    [sheetWindow hackOnHackOff:YES];
    [[NSApplication sharedApplication] beginSheet:sheetWindow
                       modalForWindow:documentWindow 
                       modalDelegate:self  didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:nil];
    [documentWindow hackOnHackOff:NO];
    [sheetWindow hackOnHackOff:NO];
}
于 2012-05-21T02:30:50.840 に答える