2013-12-18 2 views
6

С iOS 6 Apple добавила состояние восстановления в UIViewController и связанные классы. Это позволяет приложению сохранять состояние при завершении и восстанавливать его, когда пользователь возобновляет приложение.UIViewController State Restoration - слабые отношения

Все, кажется, работает нормально, однако я достиг странного сценария, который не хочет вписываться в шаблон.

Предположим, у нас есть два контроллера вида,и ViewControllerTwo, оба из них сохраняют какое-то произвольное состояние, которое успешно восстановлено. Теперь давайте представим, что ViewControllerOne имеет свойство delegate и что ViewControllerTwo является тем делегатом (который является общей моделью для модальных контроллеров просмотров). Кто отвечает за восстановление этих отношений? И как он должен быть сохранен/восстановлен?

В моем конкретном случае не задействованы раскадровки, восстановление происходит в коде через свойство restorationClass. Мой первый инстинкт состоял в том, чтобы попытаться восстановить отношения при создании контроллера вида в restClass, однако, поскольку restorationClass не имеет представления о других существующих контроллерах, он не может полностью восстановить такие отношения.

В качестве альтернативы, если это контроллер вида, объявляющий свойство delegate, то есть предполагается восстановить отношения, то как это происходит с экземпляром контроллера, который был восстановлен в каком-либо другом классе?

Короче говоря, это похоже на плохо документированный сценарий, и я надеялся, что кто-то сможет пролить свет на него.

ответ

2

Я бы сказал, задача ложится на контроллер представления делегата, чтобы установить себя как таковой, как вы это делаете, прежде чем нажимать другой контроллер вида.

Как вы можете это сделать, у вас есть несколько вариантов.

Вы можете сохранить слабую ссылку на контроллеры представления в глобально доступном месте (например, делегат приложения) и использовать эти значения в application:didDecodeRestorableStateWithCoder:, чтобы установить делегирование - это то, для чего этот метод используется в API.

В качестве альтернативы вы можете отправить уведомление «hereIAmThisIsMe» (с информацией о пользователе) с контроллера верхнего уровня, которому делегат прослушивает и устанавливает себя как делегат.

+0

Хотя это определенно правдоподобный способ делать вещи, не согласны ли вы с тем, что это не самый элегантный? то есть, похоже, что первое предложенное решение немного разрушает инкапсуляцию (AppDelegate становится «знающим все», а не тем, что вы хотите)? Второй - немного более интересный подход, куда бы вы отправили это уведомление, в decodeRestorableStateWithCoder :? –

+0

Отправка есть опция, но вам нужно беспокоиться о сроках - какой контроллер сначала восстанавливается. –

+1

@HenriNormak BTW, первый метод не обязательно разрушает инкапсуляцию. Вы можете реализовать протокол, назовем его 'PostRestorationHandler', где есть метод' didFinishRestoration', и там есть диспетчер представлений делегата. AppDelegate знает только о существовании, если диспетчеры представлений (и они о делете приложения), но он не касается внутренних элементов. –

 Смежные вопросы

  • Нет связанных вопросов^_^