import Foundation private let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey" class KMHeaderFooterManager: NSObject, NSCoding { var headFooterObjects: [KMHeaderFooterObject] = [] static let defaultManager = KMHeaderFooterManager() override init() { super.init() self.reloadData() } required init?(coder: NSCoder) { if let data = coder.decodeObject(forKey: "headFooterObjects") { headFooterObjects = data as? [KMHeaderFooterObject] ?? [] } } func encode(with coder: NSCoder) { coder.encode(headFooterObjects, forKey: "headFooterObjects") } func reloadData() { do { if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data { NSKeyedUnarchiver.setClass(KMHeaderFooterObject.self, forClassName: "KMHeaderFooterObject") NSKeyedUnarchiver.setClass(KMHeaderFooterManager.self, forClassName: "KMHeaderFooterManager") if let man = NSKeyedUnarchiver.unarchiveObject(with: storedData) as? KMHeaderFooterManager { self.headFooterObjects = man.headFooterObjects print(man) } } } catch { // 解档失败,处理错误情况 print("Error unarchiving data: \(error)") } } var onlyHeaderFooterObjects: [KMHeaderFooterObject] { return headFooterObjects.filter { !$0.isBates } } var onlyBatesObjects: [KMHeaderFooterObject] { var arr: [KMHeaderFooterObject] = [] for obj in headFooterObjects { if KMDataVersionManager.updateBatesData() { KMDataVersionManager.refrshBatesData(bates: obj) store() } if obj.isBates { arr.append(obj) } } return arr } var dateFormatArray: [String] { return [ "m/d", "m/d/yy", "m/d/yyyy", "mm/dd/yy", "mm/dd/yyyy", "d/m/yy", "d/m/yyyy", "dd/mm/yy", "dd/mm/yyyy", "mm/yy", "mm/yyyy", "m.d.yy", "m.d.yyyy", "mm.dd.yy", "mm.dd.yyyy", "mm.yy", "mm.yyyy", "d.m.yy", "d.m.yyyy", "dd.mm.yy", "dd.mm.yyyy", "yy-mm-dd", "yyyy-mm-dd" ] } func removeHeaderFooter(_ obj: KMHeaderFooterObject) -> Bool { headFooterObjects.removeAll { $0 === obj } store() return true } func removeAllHeaderFooter() -> Bool { headFooterObjects.removeAll() store() return true } func addHeaderFooter(_ obj: KMHeaderFooterObject) -> Bool { headFooterObjects.insert(obj, at: 0) store() return true } func store() { do { let encodedObject = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false) UserDefaults.standard.set(encodedObject, forKey: kHeaderFooterInfoSaveKey) UserDefaults.standard.synchronize() } catch { print("Error while encoding object: \(error)") } } func clearStored() { UserDefaults.standard.removeObject(forKey: kHeaderFooterInfoSaveKey) UserDefaults.standard.synchronize() } func fetchHeaderFooterAvailableName() -> String { var availableIndex = 0 let nameArray = onlyHeaderFooterObjects.map { $0.id } for string in nameArray { if string.hasPrefix("HeaderFooter") { let index = Int(string.suffix(from: "HeaderFooter".endIndex)) ?? 0 if index >= availableIndex { availableIndex = index + 1 } } } return "HeaderFooter\(availableIndex)" } func fetchBatesAvailableName() -> String { var availableIndex = 0 let nameArray = onlyBatesObjects.map { $0.id } for string in nameArray { if string.hasPrefix("Bates") { let index = Int(string.suffix(from: "Bates".endIndex)) ?? 0 if index >= availableIndex { availableIndex = index + 1 } } } return "Bates\(availableIndex)" } }