在基于文档的应用程序中,使用XIB文件创建新窗口时,其行为如下:
然而,当使用故事板时,这是没有完成的。参见test 项目。
发布于 2017-05-01 20:39:51
您可以在故事板中的窗口控制器上设置shouldCascadeWindows:
更新:如果您移动第一个窗口,新窗口将从屏幕中央开始,而不是在第一个窗口下面。要解决这个问题:
这还应该在下一个窗口加载和应用程序启动时保持窗口位置和大小。
发布于 2016-03-06 13:13:01
级联窗口问题
问题之一是故事板与xibs不同,可以包含NSWindowController,而Interface没有正确地序列化它。
-initWithWindow:,-initWithWindowNibName:和朋友们把shouldCascadeWindows设为YES。
当NSWindowController通过-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]或-[NSWindow frameAutosaveName]似乎只是有时起作用。随机使用初始窗口位置。
窗口大小问题
即使级联窗口位置设置正确,它也从不将大小设置为为框架保存的大小。我用defaults read window.autosavename.test1验证了保存的帧。在每次测试之前,我都会运行defaults delete window.autosavename.test1以获得干净的状态。
解决办法
使用包含空NSWindow的xib,并将-[NSDocument windowControllerDidLoadNib:或-[NSDocument addWindowController:]中的情节提要中的视图控制器添加到窗口。
发布于 2016-03-06 15:51:26
我认为答案可能是,让多个窗口共享同一个frameAutosaveName是不可能的,即使多个NSSplitView共享同一个autosaveName也是可能的。
我刚刚尝试创建另一个基于NSDocument的项目,但这次我使用的是xib,而不是故事板。行为更好(默认情况下是shouldCascadeWindows)。但是当涉及多个窗口时,新的窗口定位仍然会出现故障。
我认为这更像是一个运行时约束,然后是故事板vrs问题。下面是我刚才在Xcode生成的默认非故事板NSDocument项目中所做的一个测试:
windowControllerDidLoadNib如下所示:因此,只有创建的第一个窗口才能获得"SaveMe“自动保存程序名。对于以下所有窗口,都不会设置值。
我的结论是,您不能使用frameAutosaveName复制Safari的行为。相反,你必须做一些手动的事情。我不确定示例项目中使用的方法是否是最好的方法,但我认为无论您使用的是xibs还是故事板,Safari的行为至少需要一些手工操作。
https://stackoverflow.com/questions/35827239
复制相似问题