在基于文档的应用程序中,使用 XIB 文件,当创建一个新窗口时,它的行为是:
- 根据最后一个活动窗口的位置定位和调整大小。
- 如果最后一个活动窗口仍然可见,那么新窗口应该被级联,这样它就不会直接重叠。
但是,当使用情节提要时,这还没有完成。请参阅测试项目。
在基于文档的应用程序中,使用 XIB 文件,当创建一个新窗口时,它的行为是:
但是,当使用情节提要时,这还没有完成。请参阅测试项目。
您可以在情节提要的窗口控制器上设置 shouldCascadeWindows:
更新: 如果您移动第一个窗口,新窗口将从屏幕中间开始级联,而不是在第一个窗口下方。要解决这个问题:
这也应该在下一个窗口加载和应用程序启动时保持窗口位置和大小。
问题之一是与 xib 不同的情节提要可以包含NSWindowController
并且 Interface Builder 不能正确序列化它。
-initWithWindow:
,-initWithWindowNibName:
和朋友们shouldCascadeWindows
设置YES
。
当 aNSWindowController
从情节提要通过-initWithCoder:
,加载shouldCascadeWindows
时NO
。(OS X 10.11)
根据我的测试,需要在初始化程序中设置此属性。设置它 -[NSDocument addWindowController:]
不起作用。(OS X 10.11)
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self)
{
self.shouldCascadeWindows = YES;
}
return self;
}
见 rdar://47350352
有时使用-[NSWindowController windowFrameAutosaveName]
or-[NSWindow frameAutosaveName]
似乎只起作用。它随机使用初始窗口位置。
即使级联窗口位置设置正确,它也不会将大小设置为为框架保存的大小。我用 验证了保存的帧defaults read window.autosavename.test1
。同样在每次测试之前,我都会运行defaults delete window.autosavename.test1
一个干净的状态。
使用包含空的 xibNSWindow
并将情节提要中的视图控制器添加到窗口中-[NSDocument windowControllerDidLoadNib:
或-[NSDocument addWindowController:]
窗口中。
我认为答案可能是,frameAutosaveName
即使可以有多个 NSSplitView 共享相同的内容,也不可能让多个窗口共享相同的内容autosaveName
。
我刚刚尝试创建另一个基于 NSDocument 的项目,但这次我使用的是 xib 而不是故事板。行为更好(shouldCascadeWindows
默认为开启)。但是当涉及多个窗口时,新窗口定位仍然失败。
我认为这更多的是运行时约束,然后是故事板 vrs xib 问题。这是我刚刚在 Xcode 生成的默认非故事板 NSDocument 项目中进行的测试:
在界面生成器中设置窗口自动保存名称。
修改windowControllerDidLoadNib
为如下所示:
- (void)windowControllerDidLoadNib:(NSWindowController *)aController {
[super windowControllerDidLoadNib:aController];
NSLog(@"Listing frameAutosaveName for all windows:");
for (NSWindow *each in [NSApp windows]) {
NSLog(@"%@: %@", each.title, each.frameAutosaveName);
}
}
然后(在创建多个窗口之后)这是我看到的输出:
Listing frameAutosaveName for all windows:
Untitled: SaveMe
Untitled 2:
Untitled 3:
Untitled 4:
Untitled 5:
Window:
因此,只有创建的第一个窗口才会获得“SaveMe”自动保存名称。对于以下所有窗口,永远不会设置该值。
我的结论是你不能用它frameAutosaveName
来复制 Safari 的行为。相反,您必须手动执行一些操作。我不确定示例项目中使用的方法是否是最好的方法,但我认为无论您使用的是 xibs 还是情节提要,Safari 的行为都至少需要一些手动工作。