【发布时间】:2011-06-10 13:07:01
【问题描述】:
在大多数系统中,“打开一个新窗口”的默认行为是它出现在前面。这在 Cocoa 中不会发生,我正在尝试找到“正确”的方法来实现这种标准行为。我尝试过的大多数事情只适用于最大一个窗口。
我需要在启动时打开多个窗口:
- (N x NSDocuments(每个窗口一个窗口)
- 1 x 简单的 NSWindowController,用于打开 NIB 文件。
行不通的事情:
- 遍历我要打开的所有 NSDocument,然后打开它们。
会发生什么? ...只有调用 open 的“最后一个”出现在前面 - 其余的都是隐藏的、不可见的,在屏幕上无处可见,直到您快速切换或使用“窗口”菜单找到它们。
代码:
...documents is an array of NSPersistentDocument's, loaded from CoreData...
[NSDocumentController sharedDocumentController];
[controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error];
- 在每个窗口打开后手动调用“makeKeyAndOrderFront”
会发生什么?没什么不同。但是我能找到获取 NSWindow 实例的唯一方法是如此可怕,它似乎完全错误(但在几个博客和邮件列表帖子中都提到了)
代码:
[NSDocumentController sharedDocumentController];
NSDocument* openedDocument = [controller openDocumentWithContentsOfURL:[documents objectAtIndex:0] display:YES error:&error];
[[[[openedDocument windowControllers] objectAtIndex:0] window] makeKeyAndOrderFront:nil];
...我知道我做错了,但我不知道为什么/做什么不同:(。
通常但并非总是有效的东西:
- 如上所述,但只使用“showWindow”代替(我从 NSDocument 指南中获取)。
奇怪的是,这有时会奏效……尽管这是 Apple 声称他们在内部调用的确切代码。如果他们在内部调用它,如果我在他们已经调用它之后重新调用它,为什么它的行为会有所不同?
[[[openedDocument windowControllers] objectAtIndex:0] showWindow:self];
【问题讨论】:
-
我也尝试了第三个选项,但是使用 performSelector:withObject:delay: ... 并且它仍然只能随机工作,可能有 50% 的时间,延迟最多 1 秒左右.. . 所以我敢肯定这 - 不知何故 - 从根本上是错误的,否则它会起作用吗?
标签: cocoa nswindow nsdocument nswindowcontroller