gpt4 book ai didi

cocoa - 同步显示非模态模板选择器

转载 作者:行者123 更新时间:2023-12-03 16:27:15 25 4
gpt4 key购买 nike

我正在使用文档架构编写一个 Cocoa 应用程序。每当在此应用程序中创建无标题文档时,都应该向用户显示一个窗口,让他们选择模板并提示输入其他信息。一次只能显示这些窗口之一,并且最好在模板选择器可见时能够与应用程序的其余部分进行交互。 (这就是 Pages 的行为方式。)

我通过覆盖 -[NSDocumentController openUntitledDocumentAndDisplay:error:] 完成了大部分工作::

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument 
error:(NSError *__autoreleasing *)outError {
TsDocument * doc = [self makeUntitledDocumentOfType:self.defaultType
error:outError];
if(!doc) {
return nil;
}

TsNewWindowController * newController = [TsNewWindowController new];
newController.document = doc;

if([NSApp runModalForWindow:newController.window] == NSRunAbortedResponse) {
if(outError) {
*outError = [NSError errorWithDomain:NSCocoaErrorDomain
code:NSUserCancelledError
userInfo:nil];
}
return nil;
}

[self addDocument:doc];

if(displayDocument) {
[doc makeWindowControllers];
[doc showWindows];
}

return doc;
}

但是,正如您所看到的,该窗口以模态方式显示,阻止了对应用程序其余部分的访问。有没有一种简单的方法可以实现我想要的而不使模板选择器模态化?

<小时/>

更清楚地解释一些事情:

  1. 我当然知道 -runModalForWindow: 将以模态方式运行窗口 - 它就在名称中!我正在寻找另一种显示窗口的方法,该方法仍然会阻止 -openUntitledDocumentAndDisplay:error:,或者根本不需要我阻止该方法。

  2. 我不相信我可以简单地创建文档,显示 newController 的窗口,并调用文档的 makeWindowControllersshowWindows 稍后,因为如果应用程序退出,Restore 将不会显示模板选择器 - 它会显示正常的编辑界面。

最佳答案

您确实需要创建并使用 NSWindowController,但需要在调用 openUntitledDocument…:: 之前执行此操作。

在未发布的 Adium Xtras Creator 中,我在几个点上进行了挖掘:

  • 在应用程序委托(delegate)的 applicationOpenUntitledFile: 中,我显示模板选择器窗口并返回 YES
  • 在文档 Controller 的 removeDocument: 中,我将消息传递给 super,然后检查是否仍有任何文档打开。如果没有,我会显示模板选择器窗口。
  • 在文档 Controller 的 addDocument: 中,我隐藏了模板选择器窗口,然后传递给 super

因此:

  • 如果用户尝试以任何方式创建新文档(无特定类型),则会显示模板选择器。
  • 如果用户以任何方式创建新文档(显式类型),模板选择器将被隐藏。 (我执行此操作的应用程序将其“新建”菜单项设置为包含特定类型的子菜单。)
  • 如果用户以任何方式打开任何文档,模板选择器将被隐藏。
  • 如果用户关闭最后打开的文档,则会显示模板选择器。
  • 如果用户或其他应用程序尝试以任何方式重新打开该应用程序,将会显示模板选择器。

关于cocoa - 同步显示非模态模板选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355676/

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