KMHeaderFooterManager.swift 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import Foundation
  2. private let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey"
  3. class KMHeaderFooterManager: NSObject, NSCoding {
  4. var headFooterObjects: [KMHeaderFooterObject] = []
  5. static let defaultManager = KMHeaderFooterManager()
  6. override init() {
  7. super.init()
  8. self.reloadData()
  9. }
  10. required init?(coder: NSCoder) {
  11. if let data = coder.decodeObject(forKey: "headFooterObjects") {
  12. headFooterObjects = data as? [KMHeaderFooterObject] ?? []
  13. }
  14. }
  15. func encode(with coder: NSCoder) {
  16. coder.encode(headFooterObjects, forKey: "headFooterObjects")
  17. }
  18. func reloadData() {
  19. do {
  20. self.fetchPlistData()
  21. if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data {
  22. NSKeyedUnarchiver.setClass(KMHeaderFooterObject.self, forClassName: "KMHeaderFooterObject")
  23. NSKeyedUnarchiver.setClass(KMHeaderFooterManager.self, forClassName: "KMHeaderFooterManager")
  24. if let man = NSKeyedUnarchiver.unarchiveObject(with: storedData) as? KMHeaderFooterManager {
  25. self.headFooterObjects = man.headFooterObjects
  26. self.savePlistData()
  27. print(man)
  28. }
  29. }
  30. } catch {
  31. // 解档失败,处理错误情况
  32. print("Error unarchiving data: \(error)")
  33. }
  34. }
  35. var onlyHeaderFooterObjects: [KMHeaderFooterObject] {
  36. return headFooterObjects.filter { !$0.isBates }
  37. }
  38. var onlyBatesObjects: [KMHeaderFooterObject] {
  39. var arr: [KMHeaderFooterObject] = []
  40. for obj in headFooterObjects {
  41. if KMDataVersionManager.updateBatesData() {
  42. KMDataVersionManager.refrshBatesData(bates: obj)
  43. store()
  44. }
  45. if obj.isBates {
  46. arr.append(obj)
  47. }
  48. }
  49. return arr
  50. }
  51. var dateFormatArray: [String] {
  52. return [
  53. "m/d",
  54. "m/d/yy",
  55. "m/d/yyyy",
  56. "mm/dd/yy",
  57. "mm/dd/yyyy",
  58. "d/m/yy",
  59. "d/m/yyyy",
  60. "dd/mm/yy",
  61. "dd/mm/yyyy",
  62. "mm/yy",
  63. "mm/yyyy",
  64. "m.d.yy",
  65. "m.d.yyyy",
  66. "mm.dd.yy",
  67. "mm.dd.yyyy",
  68. "mm.yy",
  69. "mm.yyyy",
  70. "d.m.yy",
  71. "d.m.yyyy",
  72. "dd.mm.yy",
  73. "dd.mm.yyyy",
  74. "yy-mm-dd",
  75. "yyyy-mm-dd"
  76. ]
  77. }
  78. func removeHeaderFooter(_ obj: KMHeaderFooterObject) -> Bool {
  79. headFooterObjects.removeAll { $0 === obj }
  80. store()
  81. return true
  82. }
  83. func removeAllHeaderFooter() -> Bool {
  84. headFooterObjects.removeAll()
  85. store()
  86. return true
  87. }
  88. func addHeaderFooter(_ obj: KMHeaderFooterObject) -> Bool {
  89. headFooterObjects.insert(obj, at: 0)
  90. store()
  91. return true
  92. }
  93. func store() {
  94. do {
  95. let encodedObject = try NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false)
  96. UserDefaults.standard.set(encodedObject, forKey: kHeaderFooterInfoSaveKey)
  97. UserDefaults.standard.synchronize()
  98. } catch {
  99. print("Error while encoding object: \(error)")
  100. }
  101. }
  102. func clearStored() {
  103. UserDefaults.standard.removeObject(forKey: kHeaderFooterInfoSaveKey)
  104. UserDefaults.standard.synchronize()
  105. }
  106. func fetchHeaderFooterAvailableName() -> String {
  107. var availableIndex = 0
  108. let nameArray = onlyHeaderFooterObjects.map { $0.id }
  109. for string in nameArray {
  110. if string.hasPrefix("HeaderFooter") {
  111. let index = Int(string.suffix(from: "HeaderFooter".endIndex)) ?? 0
  112. if index >= availableIndex {
  113. availableIndex = index + 1
  114. }
  115. }
  116. }
  117. return "HeaderFooter\(availableIndex)"
  118. }
  119. func fetchBatesAvailableName() -> String {
  120. var availableIndex = 0
  121. let nameArray = onlyBatesObjects.map { $0.id }
  122. for string in nameArray {
  123. if string.hasPrefix("Bates") {
  124. let index = Int(string.suffix(from: "Bates".endIndex)) ?? 0
  125. if index >= availableIndex {
  126. availableIndex = index + 1
  127. }
  128. }
  129. }
  130. return "Bates\(availableIndex)"
  131. }
  132. }
  133. let kHeaderFooterFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerFooter")
  134. let kHeaderFooterPlistPath = kHeaderFooterFolderPath?.stringByAppendingPathComponent("headerFooter.plist")
  135. let kHeaderFooterRemovedKey = "kHeaderFooterRemovedKey"
  136. extension KMHeaderFooterManager {
  137. func fetchPlistData() {
  138. if (!FileManager.default.fileExists(atPath: kHeaderFooterFolderPath!)) {
  139. try?FileManager.default.createDirectory(atPath: kHeaderFooterFolderPath!, withIntermediateDirectories: false)
  140. }
  141. if (!FileManager.default.fileExists(atPath: kHeaderFooterPlistPath!)) {
  142. FileManager.default.createFile(atPath: kHeaderFooterPlistPath!, contents: nil)
  143. }
  144. print("页眉页脚文件地址 =" + kHeaderFooterPlistPath!)
  145. let plistData = try NSData(contentsOfFile: kHeaderFooterPlistPath!)
  146. // 解档 plist 数据
  147. if let headerFooterObject = try NSKeyedUnarchiver.unarchiveObject(with: plistData as! Data) as? KMHeaderFooterObject {
  148. // 如果解档成功,可以使用 headerFooterObject
  149. print("Header footer object: \(headerFooterObject)")
  150. } else {
  151. print("Failed to unarchive header footer object")
  152. }
  153. let dictionary = NSDictionary(contentsOfFile: kHeaderFooterPlistPath!)
  154. return
  155. }
  156. func savePlistData() {
  157. // 获取 KMHeaderFooterObject 对象的归档数据
  158. if let archivedData = try? NSKeyedArchiver.archivedData(withRootObject: headFooterObjects, requiringSecureCoding: false) {
  159. // 将数据写入 plist 文件
  160. let plistURL = URL(fileURLWithPath: kHeaderFooterPlistPath!)
  161. do {
  162. try archivedData.write(to: plistURL)
  163. print("Header footer object saved to plist file")
  164. } catch {
  165. print("Error writing plist file: \(error)")
  166. }
  167. } else {
  168. print("Failed to archive header footer object")
  169. }
  170. }
  171. }