1

我正在使用 Cocoa 编写一个多文档应用程序。用户在打开文档时必须输入密码。在文档上没有任何活动的一段时间后,用户再次需要输入密码。

现在我正在使用NSAplication'sbeginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:在自定义工作表中显示密码提示。虽然它有效,但不幸的是,即使当时正在处理另一个文档,窗口也会被带到前面并获得焦点。仅当我的应用程序在前面时才有问题。

如果父窗口不活动,有没有办法防止打开工作表抢夺焦点?

4

1 回答 1

0

没有简单的方法。hacky 方法是为文档窗口工作表窗口创建一个 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 回答