2010-04-29 120 views

回答

28

在界面構建器中的屬性下的自動保存字段中輸入該窗口的唯一名稱(例如「MainWindow」或「PrefsWindow」)。它將自動將其位置保存在用戶默認值中。

要以編程方式設置自動保存名稱,請使用-setFrameAutosaveName:。如果您有基於文檔的應用程序或其他一些無法在IB中設置自動保存名稱的情況,則可能需要執行此操作。

Link to documentation

+5

如果您使用的是NSWindowController,不要使用Interface Builder的autoSaveName場。請參閱下面的Gon的答案。 具體地在窗口控制器的'-windowDidLoad'方法中,調用: '[超級windowDidLoad];'' [自setShouldCascadeWindows:NO];'' [自setWindowFrameAutosaveName:@ 「MyWindowAutosaveName」];' – Womble 2015-05-11 06:15:11

4

按照doc,保存窗口的位置:

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

在斯威夫特:

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

     super.windowDidLoad() 
    } 
0

爲了恢復一個窗口,你可以在Interface Builder設置恢復ID。這將用作框架存儲在NSUserDefaults中的鍵的一部分。 - 但那不(總是)爲我工作。

NSWindowsetFrameUsingName(_:)等配置此,像@BadmintonCat寫道,您可以手動序列化的窗口位置,也是如此,在不工作,無論是哪種情況。

我的應用程序中最簡單的解決方案是使用NSWindowController.windowFrameAutosaveName屬性並將其設置爲awakeFromNib(_:)中的某些內容。該單行影響加載和保存成功。

2

我試過所有的解決方案。它只能保存位置,而不是大小。所以我們應該手動做到這一點。這是我做我GifCapture應用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) 
    } 
} 
相關問題