Сохранение протоколов «делегатов» через перезапуски приложений - PullRequest
0 голосов
/ 19 марта 2020

Я кодирую свое приложение, чтобы пережить перезапуски согласно Сохранение пользовательского интерфейса вашего приложения при запуске . Все хорошо, все переменные, локальные для вызываемого дочернего класса, выживают. Тем не менее, я застрял при попытке выяснить, как сохранить значения делегатов моего пользовательского протокола.

Например, у меня есть два контроллера представления, один запускает другой и устанавливает свойство 'делегата' вызываемого контроллера в 'self' в prepare ():

    class ParentClass: UIViewController, MyProtocolDelegate {
        ...
    }

    extension ParentClass {
      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segToChildClass" {
            guard let vc = segue.destination as? ChildClass else { return }
            [snip]
            vc.myProtocolDelegate = self
            ...
        }

    }

Теперь в дочернем классе I определена переменная 'myProtocolDelegate', и я переопределяю encodeRestorableState () и decodeRestorableState (), где я успешно кодирую и декодирую все свойства, которым локально присвоены их значения в дочернем классе:

    class ChildClass: UIViewController {
      ...
      weak var myProtocolDelegate: MyProtocolDelegate?
      ...

      override func encodeRestorableState() {
      ...
      }

      override func decodeRestorableState() {
      ...
      }
    }

Однако, когда я кодирую / декодирую ' Свойство myProtocolDelegate ', оно, безусловно, не дает желаемого эффекта (т. е. протокол не работает), например:

   override func encodeRestorableState(with coder: NSCoder) {
     ...
     coder.encode(myProtocolDelegate, forKey: "myProtocolDelegate")
   }

   override func decodeRestorableState(with coder: NSCoder) {
     ...
     myProtocolDelegate = coder.decodeObject(forKey: "myProtocolDelegate") as? MyProtocolDelegate
   }

Я думал, что мог бы использовать self.presentingViewController, чтобы получить указатель на родительский контроллер после восстановление (так что мне вообще не нужно было бы сохранять значение делегата). Примерно так:

    override func applicationFinishedRestoringState() {
        ...
        let parentController = self.presentingViewController
        self.myProtocolDelegate = parentController.self  as! ParentClass
    }

Однако в моем случае self.presentingViewController оказывается равным nil.

Буду признателен за любые подсказки о том, как можно сохранить значение myProtocolDelegate. через перезапуски.

Большое спасибо!

...