使用Obj-C來記住應用程序負載之間的Windows位置的最佳方式是什麼?我正在使用Interface Builder作爲接口,是否可以使用綁定來完成此操作。如何使用Obj-C輕鬆保存窗口大小和位置狀態?
什麼是推薦的方法?謝謝。
使用Obj-C來記住應用程序負載之間的Windows位置的最佳方式是什麼?我正在使用Interface Builder作爲接口,是否可以使用綁定來完成此操作。如何使用Obj-C輕鬆保存窗口大小和位置狀態?
什麼是推薦的方法?謝謝。
在界面構建器中的屬性下的自動保存字段中輸入該窗口的唯一名稱(例如「MainWindow」或「PrefsWindow」)。它將自動將其位置保存在用戶默認值中。
要以編程方式設置自動保存名稱,請使用-setFrameAutosaveName:
。如果您有基於文檔的應用程序或其他一些無法在IB中設置自動保存名稱的情況,則可能需要執行此操作。
按照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.
在斯威夫特:
class MainWindowController : NSWindowController {
override func windowDidLoad() {
shouldCascadeWindows = false
window?.setFrameAutosaveName("MainWindow")
super.windowDidLoad()
}
爲了恢復一個窗口,你可以在Interface Builder設置恢復ID。這將用作框架存儲在NSUserDefaults中的鍵的一部分。 - 但那不(總是)爲我工作。
NSWindow
有setFrameUsingName(_:)
等配置此,像@BadmintonCat寫道,您可以手動序列化的窗口位置,也是如此,在不工作,無論是哪種情況。
我的應用程序中最簡單的解決方案是使用NSWindowController.windowFrameAutosaveName
屬性並將其設置爲awakeFromNib(_:)
中的某些內容。該單行影響加載和保存成功。
我試過所有的解決方案。它只能保存位置,而不是大小。所以我們應該手動做到這一點。這是我做我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)
}
}
如果您使用的是NSWindowController,不要使用Interface Builder的autoSaveName場。請參閱下面的Gon的答案。 具體地在窗口控制器的'-windowDidLoad'方法中,調用: '[超級windowDidLoad];'' [自setShouldCascadeWindows:NO];'' [自setWindowFrameAutosaveName:@ 「MyWindowAutosaveName」];' – Womble 2015-05-11 06:15:11