首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于文档的autosave与故事板

基于文档的autosave与故事板
EN

Stack Overflow用户
提问于 2016-03-06 13:13:01
回答 3查看 767关注 0票数 2

在基于文档的应用程序中,使用XIB文件创建新窗口时,其行为如下:

  1. 根据最后一个活动窗口的位置进行定位和调整大小。
  2. 如果最后一个活动窗口仍然可见,那么新窗口应该是级联的,这样它就不会直接重叠。

然而,当使用故事板时,这是没有完成的。参见test 项目

EN

回答 3

Stack Overflow用户

发布于 2017-05-01 20:39:51

您可以在故事板中的窗口控制器上设置shouldCascadeWindows:

  1. 在情节提要中选择窗口控制器
  2. 选择身份检查器
  3. 使用以下值添加一个新的用户定义的Runtime属性:
  • 关键路径: shouldCascadeWindows
  • 类型:布尔型
  • 值:已检查

更新:如果您移动第一个窗口,新窗口将从屏幕中央开始,而不是在第一个窗口下面。要解决这个问题:

  1. 选择窗口
  2. 在“属性”检查器中,给它一个自动保存名称。

这还应该在下一个窗口加载和应用程序启动时保持窗口位置和大小。

票数 6
EN

Stack Overflow用户

发布于 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)

代码语言:javascript
复制
- (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:]中的情节提要中的视图控制器添加到窗口。

票数 4
EN

Stack Overflow用户

发布于 2016-03-06 15:51:26

我认为答案可能是,让多个窗口共享同一个frameAutosaveName是不可能的,即使多个NSSplitView共享同一个autosaveName也是可能的。

我刚刚尝试创建另一个基于NSDocument的项目,但这次我使用的是xib,而不是故事板。行为更好(默认情况下是shouldCascadeWindows)。但是当涉及多个窗口时,新的窗口定位仍然会出现故障。

我认为这更像是一个运行时约束,然后是故事板vrs问题。下面是我刚才在Xcode生成的默认非故事板NSDocument项目中所做的一个测试:

  1. 在接口生成器中设置窗口自动保存名称。
  2. 修改windowControllerDidLoadNib如下所示:
  • (void)windowControllerDidLoadNib:(NSWindowController *)aController {超级窗口控件each.title:aController;NSLog(@“列出所有窗口的列表frameAutosaveName:”);for ( NSApp窗口中的NSWindow*){ NSLog(@"%@:%@",each.title,each.frameAutosaveName);}
  1. 然后(在创建了许多窗口之后),这就是我看到的输出: 清单frameAutosaveName适用于所有窗口:不命名: SaveMe无题2:未命名3:未命名4:未命名5:窗口:

因此,只有创建的第一个窗口才能获得"SaveMe“自动保存程序名。对于以下所有窗口,都不会设置值。

我的结论是,您不能使用frameAutosaveName复制Safari的行为。相反,你必须做一些手动的事情。我不确定示例项目中使用的方法是否是最好的方法,但我认为无论您使用的是xibs还是故事板,Safari的行为至少需要一些手工操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35827239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档