2013-10-18 8 views
1

를 기억합니다.내가 어떻게해야합니까 확실히 문서 창은 내가 마지막에 닫은 같은 위치에서 개방 위치 등을 기억하는 문서의 창을 표준 AppKit의 NSPersistentDocument 문서의 기본 응용 프로그램을 사용하고하고 싶은 위치

Window의 IB에서 자동 둘러싸기를 설정하면 모든 문서가 동일한 위치에서 열립니다. 문서 파일 이름을 기반으로 문서의 위치를 ​​기억하고 싶습니다.

NSPersistentDocument를 서브 클래스 화하고 현재 windowControllerDidLoadNib: 함수에 자동 저장 이름을 설정했습니다. 이 기능은 거의 정상적으로 작동합니다. 단, 응용 프로그램을 닫지 않고 동일한 문서를 반복해서 열고 닫을 경우 윈도우의 높이가 작은 양 (26 픽셀) 증가 할 때마다 계단식 작업을 수행하는 것과 거의 같습니다. 그러나 앱을 완전히 닫은 다음 다시 열면 문서가 이전 위치를 정확하게 기억합니다. 내가 잘못한 일을하고 있거나 이것이 버그일까요? 창을 다시 열 때마다 크기가 조정되지 않도록 아마도 정리해야 할 정리가 있습니까? 나는 그것의 높이

- (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; 
} 

22 개 픽셀을 추가하는 다음 코드를 추가 한 다음 지금의 - (void)windowControllerDidLoadNib:(NSWindowController *)aController

NSRect rect = [self windowPositionPreference]; 
    [aController.window setFrame:rect display:YES]; 

같은 프레임을 설정하면

// 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]; 
} 

위치는 정확히 유지 될 것으로 보인다 . 확실하게 자동 소설은 단지 작동하도록되어 있습니다.

답변

1

위의 내용은 여전히 ​​작동하지 않지만 일부 혼란 스러울 정도로 자동 계단식 기능을 사용하지 않도록 설정하여 사용 중지하는 것이 불가능 해 보입니다.

이제는 내 자신의 환경 설정을 유지하고 아래 코드를 사용하여 창틀을 설정합니다. 지금까지는 완벽하게 작동하는 것으로 보이고 NSWindowController 또는 NSWindow의 고유 한 서브 클래스를 만들지 않아도되었습니다.

// Methods in subclassed NSPersistentDocument 

- (void)windowControllerDidLoadNib:(NSWindowController *)aController { 
    [aController setShouldCascadeWindows:NO]; 

    _mainWindow = aController.window; 
    [self restoreSavedWindowPosition]; 

} 

- (void)close { 

    [self saveWindowPosition]; 
    [super close]; 

} 

- (void)saveWindowPosition { 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSString *autosaveNameKey = [NSString stringWithFormat:@"OSWindow Frame %@", [self autoSaveName]]; 

    [defaults setObject:[self stringFromFrame] forKey:autosaveNameKey]; 
} 

- (void)restoreSavedWindowPosition { 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSString *autosaveNameKey = [NSString stringWithFormat:@"OSWindow Frame %@", [self autoSaveName]]; 

    NSString *frameString = [defaults objectForKey:autosaveNameKey]; 

    // Do nothing if it has not been set 
    if (frameString) { 
     [_mainWindow setFrame:[self rectFromString:frameString] display:YES animate:YES]; 
    } 
    else { 
     // Set the default for new docs 
     NSRect rect = CGRectMake(70, 350, 1000, 760); 
     [_mainWindow setFrame:rect display:YES animate:YES]; 
    } 

    return; 
} 

// Use the filename as the preferences key 
- (NSString*)autoSaveName { 

    return [[self fileURL] lastPathComponent]; 

} 

- (NSString *)stringFromFrame { 
    NSRect rect = _mainWindow.frame; 
    rect.origin.y = rect.origin.y + 26; 
    rect.size.height = rect.size.height - 26; 

    return [self stringFromRect:rect]; 
} 

- (NSString *)stringFromRect:(NSRect)rect { 
    return [NSString stringWithFormat:@"%f %f %f %f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height]; 
} 

- (NSRect)rectFromString:(NSString*)string { 
    NSRect rect; 
    NSArray *array = [string componentsSeparatedByString:@" "]; 
    rect.origin.x = [[array objectAtIndex:0] floatValue]; 
    rect.origin.y = [[array objectAtIndex:1] floatValue]; 
    rect.size.width = [[array objectAtIndex:2] floatValue]; 
    rect.size.height = [[array objectAtIndex:3] floatValue]; 
    return rect; 
}