Тоже реставрация, если нет, то какой смысл?
Сложность: Новичок | Легко | Обычный | Испытывающий
Эта статья была разработана с использованием Xcode 11.4.1 и Swift 5.2.2.
Система сохранения и восстановления состояния предназначена для заботы о состоянии пользовательского интерфейса. Но как мы можем это использовать?
Предпосылки:
- Ожидается, что вы создадите Single View Application.
Терминология
Состояние: конкретное состояние, в котором находится приложение в определенное время.
Вариант использования
Мы все были там. Вы заполняете свои данные для похода по магазинам в новом приложении yoursupermarket, которое вы только что загрузили — вам нужно больше губок для вашего «состояния» и немного ванильного порошка. для торта.
Затем… вы видите бегущую белку. Этим нужно поделиться с миром!
Вы возвращаетесь в корзину и снова попадаете на экран приветствия.
Это самое ужасное, что когда-либо случалось. Это ужасно! На ком ты это вымещаешь? вашсупермаркет. Удовлетворение потребностей клиентов действительно важно — вам действительно нужно улучшить качество обслуживания клиентов и вернуть их в то состояние, в котором они были до закрытия приложения.
В шагах State Preservation
и Restoration
.
Приложение
В этом приложении будет список товаров, которые можно добавить в корзину с помощью yoursupermarket. Потрясающий.
Удаление делегата сцены
- Удалите методы делегата сцены из
AppDelegate
и удалите файл делегата сцены. - Удалите
UIApplicationSceneManifest
изInfo.plist
- Добавьте
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, чтобы получить всю партию за один раз!
Если у вас есть вопросы, замечания или предложения, пишите мне в Твиттер