У меня есть класс Swift, в котором хранятся различные типы фильтров, применяемых в настоящее время к моему контроллеру представления. Я хочу сохранить это с помощью восстановления состояния, чтобы, если пользователь покидает приложение и возвращается, фильтры восстанавливались, даже если приложение было завершено системой.
Я не уверен, как лучше всего это сделать. Я считаю, что это как-то связано с Codable
, но как заставить это работать с кодировкой/декодированием UIViewController.
Во-первых, класс:
@objcMembers class CJDataViewControllerFilters: NSObject {
var selectedDateFilters = [String: Array<Date>]()
var selectedTitleFilters = [NSManagedObject]()
var customFilterPredicate: NSPredicate?
var customFilterName: String?
let filterStyle: SectionStyle
init(style: SectionStyle) {
self.filterStyle = style
super.init()
}
}
UIViewController (который все еще находится в Objective-C):
@interface DiaryViewController : UIViewController {
@property (nonatomic, strong) CJDataViewControllerFilters *dataFilters;
}
и восстановление состояния вызова:
- (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
[super encodeRestorableStateWithCoder:coder];
[coder encodeObject:self.dataFilters forKey: @"DataFiltersDiary"];
}
Просто это приведет к сбою, когда приложение перейдет в фоновый режим:
2020-08-15 11:37:55.470081-0700 CJournal[11367:6382501] -[XYZApp.CJDataViewControllerFilters encodeWithCoder:]: нераспознанный селектор отправлен экземпляру 0x6000014cb640
Поэтому я добавил Codable
в качестве протокола к классу CJDataViewControllerFilters
и добавил базовое соответствие:
@objcMembers class CJDataViewControllerFilters: NSObject, Codable {
func encode(to encoder: Encoder) throws {
print("CJDataViewControllerFilters: encode")
}
required init(from decoder: Decoder) throws{
print("init(from decoder)")
}
}
До сих пор вылетает по той же причине.
Как мне лучше решить эту проблему? Есть ли другой метод реализации? Кроме того, как мне вручную кодировать/декодировать такие вещи, как NSPreciate и массив NSManagedObjects?
Большинство примеров на Codable
относятся к кодированию/кодированию JSON, которое мне здесь не нужно (я думаю), поэтому был бы признателен за ответ.