objective-c - 防止自定义工作表抢夺焦点

标签 objective-c cocoa cocoa-sheet

我正在使用 Cocoa 编写一个多文档应用程序。用户打开文档时必须输入密码。在一段时间内没有对文档进行任何操作后,用户将再次被要求输入密码。

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

如果父窗口未处于事件状态,是否有办法防止打开的工作表夺取焦点?

最佳答案

没有简单的方法。黑客的方法是为文档的窗口和工作表的窗口创建 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];
}

关于objective-c - 防止自定义工作表抢夺焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10678592/

相关文章:

ios - ios应用程序的起点

ios - Soundcloud 标签音乐效果 Objective C

cocoa - 编写 iTunes : playing single tracks 脚本

objective-c - 如何在 Objective-C/Xcode/iOS 中的 .lib 文件中隐藏 url

Cocoa:NSApp beginSheet 设置应用程序委托(delegate)?

ios - 重用类最佳实践

ios - 创建一个带有自定义图像和自定义高度宽度的 UISwitch。尝试使用RCSwitch,有更好的方法吗?

objective-c - "Purge"命令的替代方案?

objective-c - 如何删除 Cocoa 添加到透明纸张的 "blur"效果?

objective-c - 如何将 NSPanel 显示为工作表