gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:24:37 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com