123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- import Foundation
- 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"
- private let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey"
- let kHeaderFooterManagerInit = "kHeaderFooterManagerInit"
- 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 {
- let pHeadFooterObjects = self.fetchPlistData()
- self.headFooterObjects = pHeadFooterObjects
-
- if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data {
- NSKeyedUnarchiver.setClass(KMHeaderFooterObject.self, forClassName: "KMHeaderFooterObject")
- NSKeyedUnarchiver.setClass(KMHeaderFooterManager.self, forClassName: "KMHeaderFooterManager")
-
- if UserDefaults.standard.object(forKey: kHeaderFooterManagerInit) == nil {
- if let man = NSKeyedUnarchiver.unarchiveObject(with: storedData) as? KMHeaderFooterManager {
- UserDefaults.standard.set("1", forKey: kHeaderFooterManagerInit)
- for object in man.headFooterObjects {
- object.isMigrate = true
- self.headFooterObjects.append(object)
- }
- }
-
- self.savePlistData()
- }
- }
- } 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)")
- // }
- self.savePlistData()
- }
- func clearStored() {
- UserDefaults.standard.removeObject(forKey: kHeaderFooterInfoSaveKey)
- UserDefaults.standard.synchronize()
-
- try?FileManager.default.removeItem(atPath: kHeaderFooterPlistPath)
- }
- 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)"
- }
- }
- extension KMHeaderFooterManager {
- func fetchPlistData() -> [KMHeaderFooterObject] {
- 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 headerFooterObjects = try NSKeyedUnarchiver.unarchiveObject(with: plistData as! Data) as? [KMHeaderFooterObject] {
- // 如果解档成功,可以使用 headerFooterObject
- print("Header footer object: \(headerFooterObjects)")
- return headerFooterObjects
- } else {
- print("Failed to unarchive header footer object")
- 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")
- }
- }
- }
|