Как я могу легко сохранить размер окна и состояние позиции с помощью Obj-C? - PullRequest
17 голосов
/ 29 апреля 2010

Каков наилучший способ запомнить положение Windows между загрузками приложений с помощью Obj-C? Я использую Interface Builder для интерфейса, возможно ли сделать это с привязками.

Какой метод рекомендуется? Спасибо.

Ответы [ 5 ]

32 голосов
/ 29 апреля 2010

Поместите имя, которое является уникальным для этого окна (например, «MainWindow» или «PrefsWindow») в поле автосохранения в разделе «Атрибуты» в Интерфейсном Разработчике. Затем его местоположение будет автоматически сохранено в ваших пользовательских настройках по умолчанию.

Чтобы установить имя автосохранения программно, используйте -setFrameAutosaveName:. Возможно, вы захотите сделать это, если у вас есть приложение на основе документа или какая-то другая ситуация, когда не имеет смысла устанавливать имя автосохранения в IB.

Ссылка на документацию .

10 голосов
/ 09 июня 2015

В Свифт:

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

        super.windowDidLoad()
    }
5 голосов
/ 02 ноября 2013

Согласно 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.
3 голосов
/ 23 июня 2017

Я перепробовал все решения. Это может только сохранить положение, а не размер. Поэтому мы должны сделать это вручную. Вот как я это делаю в своем приложении 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)
  }
}
0 голосов
/ 02 июня 2017

Чтобы восстановить окно, вы можете установить Restoration ID в Interface Builder. Это будет использоваться как часть ключа, под которым фрейм хранится в NSUserDefaults. - но это не всегда помогало мне.

NSWindow имеет setFrameUsingName(_:) и т. Д. Для настройки этого, как писал @BadmintonCat, и вы также можете сериализовать положение окна вручную, в случае, если это тоже не работает.

Самым простым решением в моем приложении было использование свойства NSWindowController.windowFrameAutosaveName и его значение в awakeFromNib(_:). Эта единственная строка повлияла на загрузку и сохранение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...