我正在使用标准的 AppKit NSPersistentDocument 文档库应用程序,并且希望文档的窗口能够记住它的位置并在上次关闭时所在的位置打开。
请注意,在窗口的 IB 中设置自动保存名称将导致所有文档在同一位置打开。我希望文档根据文档文件名记住其位置。
我已经将 NSPersistentDocument 子类化,并且当前在windowControllerDidLoadNib:
函数中设置了自动保存名称。这几乎可以正常工作,除了如果我在不关闭应用程序的情况下重复打开和关闭同一个文档,那么每次它的窗口高度都会增加一点(26 像素),几乎就像它在做级联的事情一样。但是,如果我完全关闭应用程序并重新打开它,那么文档会准确地记住它以前的位置。我做错了什么还是这是一个错误。我是否应该做一些清理工作,以确保每次重新打开窗口时都不会调整窗口大小。
// NSPersistentDocument subclass
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
LOG(@"windowControllerDidLoadNib called...");
[super windowControllerDidLoadNib:aController];
if ([self autoSaveName] != nil) {
[aController setWindowFrameAutosaveName:[self autoSaveName]];
}
[aController setShouldCascadeWindows:NO];
}
- (NSString*)autoSaveName
{
return [[self fileURL] lastPathComponent];
}
如果我添加以下代码以将 22 像素添加到其高度
- (NSRect)windowPositionPreference {
LOG(@"printUserDefaults called");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *autosaveNameKey = [NSString stringWithFormat:@"NSWindow Frame %@", [self autoSaveName]];
NSString *frameString = [defaults objectForKey:autosaveNameKey];
NSArray *array = [frameString componentsSeparatedByString:@" "];
CGFloat x = [[array objectAtIndex:0] floatValue];
CGFloat y = [[array objectAtIndex:1] floatValue];
CGFloat width = [[array objectAtIndex:2] floatValue];
CGFloat height = [[array objectAtIndex:3] floatValue];
NSRect rect = CGRectMake(x, y, width, height+22);
FLOG(@" window frame = %fx, %fy, %fw, %fh", x, y, width, height);
return rect;
}
然后像这样设置框架- (void)windowControllerDidLoadNib:(NSWindowController *)aController
NSRect rect = [self windowPositionPreference];
[aController.window setFrame:rect display:YES];
这个位置似乎被完全保留了。当然 autosavename 只是为了工作。