import Foundation private let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey" class KMHeaderFooterManager: NSObject, NSCoding { var headFooterObjects: [KMHeaderFooterObject] = [] override init() { super.init() } required init?(coder: NSCoder) { headFooterObjects = coder.decodeObject(forKey: "headFooterObjects") as? [KMHeaderFooterObject] ?? [] } func encode(with coder: NSCoder) { coder.encode(headFooterObjects, forKey: "headFooterObjects") } static func defaultManager() -> KMHeaderFooterManager { let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data if let storedData = storedData { if let manager = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(storedData) as? KMHeaderFooterManager { return manager } } let manager = KMHeaderFooterManager() if manager.headFooterObjects.isEmpty { manager.headFooterObjects = [] } return manager } 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)" } }