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 { self.fetchPlistData() 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 self.savePlistData() 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)" } } let kHeaderFooterFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerFooter") let kHeaderFooterPlistPath = kHeaderFooterFolderPath?.stringByAppendingPathComponent("headerFooter.plist") let kHeaderFooterRemovedKey = "kHeaderFooterRemovedKey" extension KMHeaderFooterManager { func fetchPlistData() { if (!FileManager.default.fileExists(atPath: kHeaderFooterFolderPath!)) { try?FileManager.default.createDirectory(atPath: kHeaderFooterFolderPath!, withIntermediateDirectories: false) } if (!FileManager.default.fileExists(atPath: kHeaderFooterPlistPath!)) { FileManager.default.createFile(atPath: kHeaderFooterPlistPath!, contents: nil) } print("页眉页脚文件地址 =" + kHeaderFooterPlistPath!) let plistData = try NSData(contentsOfFile: kHeaderFooterPlistPath!) // 解档 plist 数据 if let headerFooterObject = try NSKeyedUnarchiver.unarchiveObject(with: plistData as! Data) as? KMHeaderFooterObject { // 如果解档成功,可以使用 headerFooterObject print("Header footer object: \(headerFooterObject)") } else { print("Failed to unarchive header footer object") } let dictionary = NSDictionary(contentsOfFile: kHeaderFooterPlistPath!) return } func savePlistData() { // 获取 KMHeaderFooterObject 对象的归档数据 if let archivedData = try? NSKeyedArchiver.archivedData(withRootObject: headFooterObjects, requiringSecureCoding: false) { // 将数据写入 plist 文件 let plistURL = URL(fileURLWithPath: kHeaderFooterPlistPath!) do { try archivedData.write(to: plistURL) print("Header footer object saved to plist file") } catch { print("Error writing plist file: \(error)") } } else { print("Failed to archive header footer object") } } }