NSSplitView
è noto per essere particolarmente pignolo e problematico; a volte devi fare di tutto per farlo comportarsi correttamente. Sapevo che le mie impostazioni venivano salvate in User Defaults
- Potevo vederle cambiare correttamente tramite il Terminale "Defaults read etc...
", ma non venivano ripristinati quando l'applicazione si riapriva.
Ho risolto il problema leggendo manualmente i valori salvati e ripristinando le posizioni del divisore durante awakeFromNib
.
Ecco una categoria a NSSplitView che chiede gentilmente a Si prega di impostare le proprie posizioni divisori ai valori salvati automaticamente:
@interface NSSplitView (PraxCategories)
- (void)restoreAutosavedPositions;
@end
@implementation NSSplitView (PraxCategories)
- (void)restoreAutosavedPositions {
// Yes, I know my Autosave Name; but I won't necessarily restore myself automatically.
NSString *key = [NSString stringWithFormat:@"NSSplitView Subview Frames %@", self.autosaveName];
NSArray *subviewFrames = [[NSUserDefaults standardUserDefaults] valueForKey:key];
// the last frame is skipped because I have one less divider than I have frames
for (NSInteger i=0; i < (subviewFrames.count - 1); i++) {
// this is the saved frame data - it's an NSString
NSString *frameString = subviewFrames[i];
NSArray *components = [frameString componentsSeparatedByString:@", "];
// only one component from the string is needed to set the position
CGFloat position;
// if I'm vertical the third component is the frame width
if (self.vertical) position = [components[2] floatValue];
// if I'm horizontal the fourth component is the frame height
else position = [components[3] floatValue];
[self setPosition:position ofDividerAtIndex:i];
}
}
@end
Poi basta chiamare il metodo durante awakeFromNib
per ogni NSSplitView
si desidera ripristinare:
for (NSSplitView *splitView in @[thisSplitView, thatSplitView, anotherSplitView]) {
[splitView restoreAutosavedPositions];
}
Per me funziona perfettamente con un nuovo progetto. Hai assegnato alla vista divisa un nome di salvataggio automatico? Come si ferma il programma durante il test? Usando Cmd-Q, o il pulsante stop in XCode? –