2010-04-29 10 views

risposta

28

Inserire un nome che è univoco per quella finestra (ad esempio "MainWindow" o "PrefsWindow") nel campo Autosave in Attributi in Interface Builder. Avrà quindi la sua posizione salvata automaticamente nelle impostazioni predefinite dell'utente.

Per impostare il nome di salvataggio automatico a livello di codice, utilizzare -setFrameAutosaveName:. Si consiglia di farlo se si dispone di un'app basata su documenti o di qualche altra situazione in cui non ha senso impostare il nome di salvataggio automatico in IB.

Link to documentation.

+5

Se si utilizza un NSWindowController, non uso il campo Interface Builder autoSaveName. Vedi la risposta di Gon sotto. In particolare in 'metodo -windowDidLoad' del controller della finestra, chiamare: ' [super windowDidLoad]; '' [auto setShouldCascadeWindows: NO]; '' [auto setWindowFrameAutosaveName: @ "MyWindowAutosaveName"]; ' – Womble

4

Secondo il doc, per salvare la posizione di una finestra:

NSWindow *window = // the window in question 
[[window windowController] setShouldCascadeWindows:NO];  // Tell the controller to not cascade its windows. 
[window setFrameAutosaveName:[window representedFilename]]; // Specify the autosave name for the window. 
8

In Swift:

class MainWindowController : NSWindowController { 
    override func windowDidLoad() { 
     shouldCascadeWindows = false 
     window?.setFrameAutosaveName("MainWindow") 

     super.windowDidLoad() 
    } 
0

Al fine di ripristinare una finestra, è possibile impostare l'ID Restauro di Interface Builder. Questo sarà usato come parte della chiave sotto la quale il frame è memorizzato in NSUserDefaults. - ma quello non ha (sempre) funzionato per me.

NSWindow ha setFrameUsingName(_:) per configurare questo, come @BadmintonCat ha scritto, ed è anche possibile serializzare manualmente la posizione della finestra, nel caso in cui non funziona, neanche.

La soluzione più semplice nella mia app era usare la proprietà NSWindowController.windowFrameAutosaveName e impostarla su qualcosa in awakeFromNib(_:). Quella singola riga influiva sul caricamento e sul salvataggio con successo.

2

Ho provato tutte le soluzioni. Può solo salvare la posizione, non la dimensione. Quindi dovremmo farlo manualmente. Questo è come lo faccio sul mio GifCapture app https://github.com/onmyway133/GifCapture

class MainWindowController: NSWindowController, NSWindowDelegate { 

    let key = "GifCaptureFrameKey" 

    override func windowDidLoad() { 
    super.windowDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(windowWillClose(_:)), name: Notification.Name.NSWindowWillClose, object: nil) 
    } 

    override func awakeFromNib() { 
    super.awakeFromNib() 

    guard let data = UserDefaults.standard.data(forKey: key), 
     let frame = NSKeyedUnarchiver.unarchiveObject(with: data) as? NSRect else { 
     return 
    } 

    window?.setFrame(frame, display: true) 
    } 

    func windowWillClose(_ notification: Notification) { 
    guard let frame = window?.frame else { 
     return 
    } 

    let data = NSKeyedArchiver.archivedData(withRootObject: frame) 
    UserDefaults.standard.set(data, forKey: key) 
    } 
} 
Problemi correlati