Тоже реставрация, если нет, то какой смысл?

Сложность: Новичок | Легко | Обычный | Испытывающий

Эта статья была разработана с использованием Xcode 11.4.1 и Swift 5.2.2.

Система сохранения и восстановления состояния предназначена для заботы о состоянии пользовательского интерфейса. Но как мы можем это использовать?

Предпосылки:

Терминология

Состояние: конкретное состояние, в котором находится приложение в определенное время.

Вариант использования

Мы все были там. Вы заполняете свои данные для похода по магазинам в новом приложении yoursupermarket, которое вы только что загрузили — вам нужно больше губок для вашего «состояния» и немного ванильного порошка. для торта.

Затем… вы видите бегущую белку. Этим нужно поделиться с миром!

Вы возвращаетесь в корзину и снова попадаете на экран приветствия.

Это самое ужасное, что когда-либо случалось. Это ужасно! На ком ты это вымещаешь? вашсупермаркет. Удовлетворение потребностей клиентов действительно важно — вам действительно нужно улучшить качество обслуживания клиентов и вернуть их в то состояние, в котором они были до закрытия приложения.

В шагах State Preservation и Restoration.

Приложение

В этом приложении будет список товаров, которые можно добавить в корзину с помощью yoursupermarket. Потрясающий.

Удаление делегата сцены

  1. Удалите методы делегата сцены из AppDelegate и удалите файл делегата сцены.
  2. Удалите UIApplicationSceneManifest из Info.plist
  3. Добавьте var window:UIWindow? в AppDelegate

AppDelegate

В делегате приложения мы можем подписаться на восстановление и сохранение ApplicationState.

func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
    return true
}
func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
    return true
}

Назначить идентификатор восстановления

В раскадровке мы можем добавить идентификатор восстановления:

tablerestoration, который можно установить в раскадровке:

Это для UIViewController, однако нам нужно также установить идентификатор восстановления для UITableView. Последнее было создано программно в этой версии приложения, что означает, что нам нужно установить restorationIdentifier, определив resortationID в контроллере представления:

let restorationID = “tableviewrestorisation”

и затем мы можем установить это в функции viewDidLoad().

tableView.restorationIdentifier = “tableviewrestoration”

Функции в каждом UIViewController

Здесь у нас есть только одна UIViewController, и мы можем добавить следующую пару функций — func encodeRestorableState(with coder: NSCoder) и func decodeRestorableState(with coder: NSCoder)

Рекомендуется вызывать super, чтобы позволить любым классам вверх по цепочке выполнять операции восстановления.

Поэтому: БУМ.

Хотите весь код? Я могу сделать это для вас:

Версия iOS 13

Удаление делегата сцены

1. Удалите методы делегата сцены из AppDelegate и удалите файл делегата сцены.

2. Удалите UIApplicationSceneManifest из Info.plist.

3. Добавьте переменную window:UIWindow? в AppDelegate

идентификатор восстановления

В раскадровке мы можем добавить идентификатор восстановления:

tablerestoration, который можно установить в раскадровке

Это для UIViewController

AppDelegate

Мы заменяем функции AppDelegate на следующие:

Просмотр контроллера

Внутри ViewController я храню tableView.contentOffset со следующим:

Еще раз, вот полный код контроллера представления, чтобы его было немного легче понять:

Тестирование

Простой отправки приложения в фоновый режим недостаточно, чтобы проверить, правильно ли сохранено состояние приложения (важен следующий порядок):

  • Запустите приложение в симуляторе и внесите изменения в приложение, чтобы создать состояние. В приведенном выше примере табличное представление можно прокручивать и выбирать ячейку.
  • Используйте кнопку «Домой», чтобы перевести приложение в фоновый режим; это можно сделать с помощью сочетания клавиш ⇧⌘H
  • В Xcode остановите выполнение приложения

Приложение больше не работает, но внутри приложения сохранено фоновое состояние. Затем мы можем перезагрузить приложение — и оно вернется на передний план с сохраненным текущим состоянием.

Почему это имеет значение?

Пользовательский опыт является ключевым. Вы когда-нибудь пользовались Apple Music, прекращали воспроизведение и переводили приложение в фоновый режим? Он потеряет след — это болезненно и плохой опыт.

Хотите восторга клиентов? Вы должны сделать лучше!

Вывод

Сохранение состояния приложения важно для взаимодействия с пользователем. Для того, чтобы дать вашему пользователю такой отличный опыт, рекомендуется реализовать сохранение состояния — это, конечно, не так уж сложно и вполне может дать вашему приложению преимущество над конкурентами.

Примечание. Это способ ведения дел в iOS12, и вы можете столкнуться с проблемами, если собираетесь использовать эту постоянство на iOS13 или с помощью iPADOS. Решение? Яблоко тебя прикрыло.

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

Если у вас есть вопросы, замечания или предложения, пишите мне в Твиттер