KMHeaderFooterManager.swift 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. //
  2. // KMHeaderFooterManager.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2022/12/27.
  6. //
  7. import Cocoa
  8. let kHeaderFooterInfoSaveKey = "kHeaderFooterInfoSaveKey"
  9. class KMHeaderFooterObject: NSObject, NSCopying, NSCoding{
  10. var type: KMBatchHeaderFooterType = .HeaderFooter
  11. var leftMargin: Int = 30
  12. var rightMargin: Int = 30
  13. var bottomMargin: Int = 30
  14. var topMargin: Int = 30
  15. var topLeftString: String = ""
  16. var topCenterString: String = ""
  17. var topRightString: String = ""
  18. var bottomLeftString: String = ""
  19. var bottomCenterString: String = ""
  20. var bottomRightString: String = ""
  21. var startString: String = "1"
  22. var fontSize: CGFloat = 16.0
  23. var textColor: NSColor = .black
  24. var pagesString: String = ""
  25. var isBates: Bool = false
  26. var batesPrefixString: String = ""
  27. var batesSuffixString: String = ""
  28. var batesDigits: Int = 0
  29. var hasHeader: Bool = false
  30. var hasFooter: Bool = false
  31. var cellHeight: CGFloat = 0.0{
  32. willSet{
  33. }
  34. didSet {
  35. if cellHeight < 0.1 {
  36. var baseHeight: CGFloat = 33.0 + 24.0
  37. if self.topLeftString.count > 0 {
  38. baseHeight += 20.0
  39. }
  40. if topCenterString.count > 0 {
  41. baseHeight += 20.0
  42. }
  43. if topRightString.count > 0 {
  44. baseHeight += 20.0
  45. }
  46. if bottomLeftString.count > 0 {
  47. baseHeight += 20.0
  48. }
  49. if bottomCenterString.count > 0 {
  50. baseHeight += 20.0
  51. }
  52. if bottomRightString.count > 0 {
  53. baseHeight += 20.0
  54. }
  55. baseHeight -= 4.0
  56. cellHeight = baseHeight
  57. }
  58. }
  59. }
  60. var headerFooterID: String = ""
  61. var pageChoice: KMBatchOperatePageChoice = .All
  62. var dateFormatString: String = "m/d"
  63. var pageFormatString: String = "1"
  64. override init() {
  65. super.init()
  66. self.topLeftString = ""
  67. self.topCenterString = ""
  68. self.topRightString = ""
  69. self.bottomLeftString = ""
  70. self.bottomCenterString = ""
  71. self.bottomRightString = ""
  72. self.startString = ""
  73. self.pagesString = ""
  74. self.batesPrefixString = ""
  75. self.batesSuffixString = ""
  76. self.headerFooterID = ""
  77. self.fontSize = 16.0
  78. self.dateFormatString = "m/d"
  79. self.startString = "1"
  80. self.pageFormatString = "1"
  81. self.textColor = .black
  82. self.leftMargin = 30
  83. self.rightMargin = 30
  84. self.topMargin = 30
  85. self.bottomMargin = 30
  86. }
  87. func copy(with zone: NSZone? = nil) -> Any {
  88. var obj: KMHeaderFooterObject = KMHeaderFooterObject()
  89. obj.type = self.type
  90. obj.leftMargin = self.leftMargin
  91. obj.rightMargin = self.rightMargin
  92. obj.bottomMargin = self.bottomMargin
  93. obj.topMargin = self.topMargin
  94. obj.topLeftString = self.topLeftString
  95. obj.topCenterString = self.topCenterString
  96. obj.topRightString = self.topRightString
  97. obj.bottomLeftString = self.bottomLeftString
  98. obj.bottomCenterString = self.bottomCenterString
  99. obj.bottomRightString = self.bottomRightString
  100. obj.startString = self.startString
  101. obj.fontSize = self.fontSize
  102. obj.textColor = self.textColor
  103. obj.pagesString = self.pagesString
  104. obj.isBates = self.isBates
  105. obj.batesPrefixString = self.batesPrefixString
  106. obj.batesSuffixString = self.batesSuffixString
  107. obj.batesDigits = self.batesDigits
  108. obj.headerFooterID = self.headerFooterID
  109. obj.hasHeader = self.hasHeader
  110. obj.hasFooter = self.hasFooter
  111. obj.pageChoice = self.pageChoice
  112. obj.pageFormatString = self.pageFormatString
  113. obj.dateFormatString = self.dateFormatString
  114. return obj;
  115. }
  116. func encode(with coder: NSCoder) {
  117. coder.encode(self.type.rawValue, forKey: "type")
  118. coder.encode(self.leftMargin, forKey: "leftMargin")
  119. coder.encode(self.rightMargin, forKey: "rightMargin")
  120. coder.encode(self.bottomMargin, forKey: "bottomMargin")
  121. coder.encode(self.topMargin, forKey: "topMargin")
  122. coder.encode(self.topLeftString, forKey: "topLeftString")
  123. coder.encode(self.topCenterString, forKey: "topCenterString")
  124. coder.encode(self.topRightString, forKey: "topRightString")
  125. coder.encode(self.bottomLeftString, forKey: "bottomLeftString")
  126. coder.encode(self.bottomCenterString, forKey: "bottomCenterString")
  127. coder.encode(self.bottomRightString, forKey: "bottomRightString")
  128. coder.encode(self.startString, forKey: "startString")
  129. coder.encode(self.fontSize, forKey: "fontSize")
  130. coder.encode(self.textColor, forKey: "textColor")
  131. coder.encode(self.pagesString, forKey: "pagesString")
  132. coder.encode(self.isBates, forKey: "isBates")
  133. coder.encode(self.batesPrefixString, forKey: "batesPrefixString")
  134. coder.encode(self.batesSuffixString, forKey: "batesSuffixString")
  135. coder.encode(self.batesDigits, forKey: "batesDigits")
  136. coder.encode(self.hasHeader, forKey: "hasHeader")
  137. coder.encode(self.hasFooter, forKey: "hasFooter")
  138. coder.encode(self.cellHeight, forKey: "cellHeight")
  139. coder.encode(self.headerFooterID, forKey: "headerFooterID")
  140. coder.encode(self.pageChoice, forKey: "pageChoice")
  141. coder.encode(self.dateFormatString, forKey: "dateFormatString")
  142. coder.encode(self.pageFormatString, forKey: "pageFormatString")
  143. }
  144. required init?(coder: NSCoder) {
  145. type = KMBatchHeaderFooterType(rawValue: coder.decodeInteger(forKey: "type")) ?? .HeaderFooter
  146. leftMargin = coder.decodeInteger(forKey: "leftMargin")
  147. rightMargin = coder.decodeInteger(forKey: "rightMargin")
  148. bottomMargin = coder.decodeInteger(forKey: "bottomMargin")
  149. topMargin = coder.decodeInteger(forKey: "topMargin")
  150. topLeftString = coder.decodeObject(forKey: "topLeftString") as! String
  151. topCenterString = coder.decodeObject(forKey: "topCenterString") as! String
  152. topRightString = coder.decodeObject(forKey: "topRightString") as! String
  153. bottomLeftString = coder.decodeObject(forKey: "bottomLeftString") as! String
  154. bottomCenterString = coder.decodeObject(forKey: "bottomCenterString") as! String
  155. bottomRightString = coder.decodeObject(forKey: "bottomCenterString") as! String
  156. startString = coder.decodeObject(forKey: "startString") as! String
  157. fontSize = CGFloat(coder.decodeFloat(forKey: "fontSize"))
  158. textColor = coder.decodeObject(forKey: "textColor") as! NSColor
  159. pagesString = coder.decodeObject(forKey: "pagesString") as! String
  160. isBates = coder.decodeBool(forKey: "isBates")
  161. batesPrefixString = coder.decodeObject(forKey: "batesPrefixString") as! String
  162. batesSuffixString = coder.decodeObject(forKey: "batesSuffixString") as! String
  163. batesDigits = coder.decodeInteger(forKey: "batesDigits")
  164. hasHeader = coder.decodeBool(forKey: "hasHeader")
  165. hasFooter = coder.decodeBool(forKey: "hasFooter")
  166. cellHeight = CGFloat(coder.decodeFloat(forKey: "cellHeight"))
  167. headerFooterID = coder.decodeObject(forKey: "headerFooterID") as! String
  168. pageChoice = KMBatchOperatePageChoice(rawValue: coder.decodeInteger(forKey: "pageChoice")) ?? .All
  169. dateFormatString = coder.decodeObject(forKey: "dateFormatString") as! String
  170. pageFormatString = coder.decodeObject(forKey: "pageFormatString") as! String
  171. }
  172. func copyData(dataObj: KMHeaderFooterObject) {
  173. type = dataObj.type
  174. leftMargin = dataObj.leftMargin
  175. rightMargin = dataObj.rightMargin
  176. bottomMargin = dataObj.bottomMargin
  177. topMargin = dataObj.topMargin
  178. topLeftString = dataObj.topLeftString
  179. topCenterString = dataObj.topCenterString
  180. topRightString = dataObj.topRightString
  181. bottomLeftString = dataObj.bottomLeftString
  182. bottomCenterString = dataObj.bottomCenterString
  183. bottomRightString = dataObj.bottomRightString
  184. startString = dataObj.startString
  185. fontSize = dataObj.fontSize
  186. textColor = dataObj.textColor
  187. pagesString = dataObj.pagesString
  188. isBates = dataObj.isBates
  189. batesPrefixString = dataObj.batesPrefixString
  190. batesSuffixString = dataObj.batesSuffixString
  191. batesDigits = dataObj.batesDigits
  192. hasHeader = dataObj.hasHeader
  193. hasFooter = dataObj.hasFooter
  194. cellHeight = dataObj.cellHeight
  195. headerFooterID = dataObj.headerFooterID
  196. pageChoice = dataObj.pageChoice
  197. dateFormatString = dataObj.dateFormatString
  198. pageFormatString = dataObj.pageFormatString
  199. }
  200. }
  201. class KMHeaderFooterManager: NSObject, NSCoding{
  202. let kFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter")
  203. let kPlistPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(Bundle.main.bundleIdentifier!).stringByAppendingPathComponent("headerfooter").stringByAppendingPathComponent("headerfooter.plist")
  204. static let defaultManager: KMHeaderFooterManager = {
  205. var manager = KMHeaderFooterManager()
  206. if let storedData = UserDefaults.standard.value(forKey: kHeaderFooterInfoSaveKey) as? Data {
  207. manager = NSKeyedUnarchiver.unarchiveObject(with: storedData) as! KMHeaderFooterManager
  208. } else {
  209. manager = KMHeaderFooterManager()
  210. if manager.headFooterObjects == nil {
  211. manager.headFooterObjects = []
  212. }
  213. }
  214. return manager
  215. }()
  216. func encode(with coder: NSCoder) {
  217. coder.encode(self.headFooterObjects, forKey: "headFooterObjects")
  218. }
  219. required init?(coder: NSCoder) {
  220. self.headFooterObjects = coder.decodeObject(forKey: "headFooterObjects") as? [KMHeaderFooterObject]
  221. }
  222. var datas: Array<KMHeaderFooterModel> = []
  223. var headFooterObjects: [KMHeaderFooterObject]?
  224. lazy var dateFormatArray: Array = {
  225. let arr = [
  226. "m/d",
  227. "m/d/yy",
  228. "m/d/yyyy",
  229. "mm/dd/yy",
  230. "mm/dd/yyyy",
  231. "d/m/yy",
  232. "d/m/yyyy",
  233. "dd/mm/yy",
  234. "dd/mm/yyyy",
  235. "mm/yy",
  236. "mm/yyyy",
  237. "m.d.yy",
  238. "m.d.yyyy",
  239. "mm.dd.yy",
  240. "mm.dd.yyyy",
  241. "mm.yy",
  242. "mm.yyyy",
  243. "d.m.yy",
  244. "d.m.yyyy",
  245. "dd.mm.yy",
  246. "dd.mm.yyyy",
  247. "yy-mm-dd",
  248. "yyyy-mm-dd"
  249. ]
  250. return arr
  251. }()
  252. lazy var onlyBatesObjects: [KMHeaderFooterObject] = {
  253. var arr: [KMHeaderFooterObject] = Array<KMHeaderFooterObject>()
  254. for i in 0..<(headFooterObjects?.count ?? 0) {
  255. let obj = headFooterObjects?[i]
  256. if KMDataVersionManager.updateBatesData() {
  257. KMDataVersionManager.refrshBatesData(bates: obj)
  258. store()
  259. }
  260. if obj!.isBates {
  261. arr.append(obj!)
  262. }
  263. }
  264. return arr
  265. }()
  266. lazy var onlyHeaderFooterObjects: [KMHeaderFooterObject] = {
  267. var arr: [KMHeaderFooterObject] = Array<KMHeaderFooterObject>()
  268. for i in 0..<(headFooterObjects?.count ?? 0) {
  269. let obj = headFooterObjects?[i]
  270. if !obj!.isBates {
  271. arr.append(obj!)
  272. }
  273. }
  274. return arr
  275. }()
  276. override init() {
  277. super.init()
  278. if (FileManager.default.fileExists(atPath: kPlistPath!)) {
  279. let dataDict = NSDictionary(contentsOfFile: kPlistPath!)
  280. if (dataDict == nil) {
  281. return
  282. }
  283. for keyIndex in 0 ..< (dataDict?.allKeys.count)! {
  284. let key: String = dataDict?.allKeys[keyIndex] as! String
  285. let backgroundDict: NSDictionary = dataDict?.object(forKey: key) as! NSDictionary
  286. let model = parseDictionary(dict: backgroundDict)
  287. /// 赋值id
  288. model.id = key
  289. self.datas.append(model)
  290. }
  291. /// 根据id进行排序(升序)
  292. self.datas.sort(){$0.id > $1.id}
  293. }
  294. }
  295. func store() {
  296. let encodedObject = NSKeyedArchiver.archivedData(withRootObject: self)
  297. let defaults = UserDefaults.standard
  298. defaults.set(encodedObject, forKey: kHeaderFooterInfoSaveKey)
  299. defaults.synchronize()
  300. }
  301. func fetchBatesAvailableName() -> String {
  302. var availableIndex = 0
  303. let nameArray = converArrType(arr: onlyBatesObjects, keyString: "headerFooterID")
  304. for i in 0..<nameArray.count {
  305. let string = nameArray[i]
  306. if string.hasPrefix("Bates") {
  307. let index = Int(string.substring(from: "Bates".endIndex))!
  308. if index >= availableIndex {
  309. availableIndex = index + 1
  310. }
  311. }
  312. }
  313. return String(format: "Bates%ld", availableIndex)
  314. }
  315. func fetchHeaderFooterAvailableName() -> String {
  316. var availableIndex = 0
  317. let nameArray = converArrType(arr: onlyHeaderFooterObjects, keyString: "headerFooterID")
  318. for i in 0..<nameArray.count {
  319. let string = nameArray[i]
  320. if string.hasPrefix("HeaderFooter") {
  321. let index = Int(string.substring(from: "HeaderFooter".endIndex))!
  322. if index >= availableIndex {
  323. availableIndex = index + 1
  324. }
  325. }
  326. }
  327. return String(format: "HeaderFooter%ld", availableIndex)
  328. }
  329. func converArrType(arr: Array<KMHeaderFooterObject>, keyString: String) -> [String] {
  330. var newArr = NSMutableArray()
  331. for item in arr {
  332. newArr.add(item.headerFooterID)
  333. }
  334. return newArr as! [String]
  335. }
  336. func addTemplate(_ model: KMHeaderFooterModel) -> Bool {
  337. if (!FileManager.default.fileExists(atPath: kFolderPath!)) {
  338. let create: ()? = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false)
  339. if (create == nil) {
  340. return false
  341. }
  342. }
  343. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  344. let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil)
  345. if (create == nil) {
  346. return false
  347. }
  348. }
  349. let dict = NSDictionary(contentsOfFile: kPlistPath!)
  350. var newDict:NSMutableDictionary!
  351. if (dict != nil) {
  352. newDict = NSMutableDictionary(dictionary: dict!)
  353. } else {
  354. newDict = NSMutableDictionary()
  355. }
  356. let modelDict = self.parseModel(model: model)
  357. let tag = tagString()
  358. newDict.addEntries(from: [tag : modelDict])
  359. model.id = tag
  360. let result = newDict.write(toFile: kPlistPath!, atomically: true)
  361. if (result) {
  362. if (self.datas.count < 1) {
  363. self.datas.append(model)
  364. } else {
  365. self.datas.insert(model, at: 0)
  366. }
  367. }
  368. return result
  369. }
  370. func deleteTemplate(_ model: KMHeaderFooterModel) -> Bool {
  371. if (model.id.isEmpty) {
  372. return false
  373. }
  374. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  375. return false
  376. }
  377. let key: String = model.id
  378. let dictionary = NSDictionary(contentsOfFile: kPlistPath!)
  379. var newDictionary: NSMutableDictionary!
  380. if (dictionary != nil) {
  381. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  382. } else {
  383. newDictionary = NSMutableDictionary()
  384. }
  385. newDictionary.removeObject(forKey: key)
  386. let result = newDictionary.write(toFile: kPlistPath!, atomically: true)
  387. if (result) {
  388. if (self.datas.contains(model)) {
  389. self.datas.removeObject(model)
  390. }
  391. }
  392. return result
  393. }
  394. func deleteAllTemplate() -> Bool {
  395. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  396. return false
  397. }
  398. let dictionary = NSDictionary(contentsOfFile: kPlistPath!)
  399. var newDictionary: NSMutableDictionary!
  400. if (dictionary != nil) {
  401. newDictionary = NSMutableDictionary(dictionary: dictionary!)
  402. } else {
  403. newDictionary = NSMutableDictionary()
  404. }
  405. newDictionary.removeAllObjects()
  406. let result = newDictionary.write(toFile: kPlistPath!, atomically: true)
  407. if (result) {
  408. self.datas.removeAll()
  409. }
  410. return result
  411. }
  412. func updateTemplate(_ model: KMHeaderFooterModel) -> Bool {
  413. if (!FileManager.default.fileExists(atPath: kFolderPath!)) {
  414. let create = try?FileManager.default.createDirectory(atPath: kFolderPath!, withIntermediateDirectories: false)
  415. if (create == nil) {
  416. return false
  417. }
  418. }
  419. if (!FileManager.default.fileExists(atPath: kPlistPath!)) {
  420. let create = try?FileManager.default.createFile(atPath: kPlistPath!, contents: nil)
  421. if (create == nil) {
  422. return false
  423. }
  424. }
  425. var flagModel: KMHeaderFooterModel!
  426. for model_ in self.datas {
  427. if (model_.id == model.id) {
  428. flagModel = model_
  429. break
  430. }
  431. }
  432. if (flagModel == nil) {
  433. return false
  434. }
  435. let dict = NSDictionary(contentsOfFile: kPlistPath!)
  436. var newDict:NSMutableDictionary!
  437. if (dict != nil) {
  438. newDict = NSMutableDictionary(dictionary: dict!)
  439. } else {
  440. newDict = NSMutableDictionary()
  441. }
  442. let modelDict = self.parseModel(model: model)
  443. newDict.setObject(modelDict, forKey: flagModel.id as NSCopying)
  444. let result = newDict.write(toFile: kPlistPath!, atomically: true)
  445. if (result) {
  446. let index = self.datas.index(of: flagModel)
  447. self.datas[index!] = model
  448. }
  449. return result
  450. }
  451. func removeHeaderFooter(_ obj: KMHeaderFooterObject) {
  452. self.headFooterObjects?.removeObject(obj)
  453. self.store()
  454. }
  455. /**
  456. `Private Methods`
  457. */
  458. private func parseModel(model: KMHeaderFooterModel) -> Dictionary<String, Any> {
  459. var dict: [String : Any] = [:]
  460. /// 字体相关
  461. switch model.textFont {
  462. case .font(name: var name, size: var size):
  463. dict["fontName"] = name
  464. dict["fontSize"] = size
  465. default: break
  466. }
  467. switch model.textColor {
  468. case .color(red: var red, green: var green, blue: var blue, alpha: var alpha):
  469. dict["red"] = red
  470. dict["green"] = green
  471. dict["blue"] = blue
  472. dict["alpha"] = alpha
  473. default: break
  474. }
  475. /// 页边距
  476. dict["leftMargin"] = model.leftMargin
  477. dict["rightMargin"] = model.rightMargin
  478. dict["bottomMargin"] = model.bottomMargin
  479. dict["topMargin"] = model.topMargin
  480. /// 内容
  481. dict["topLeftString"] = model.topLeftString
  482. dict["topCenterString"] = model.topCenterString
  483. dict["topRightString"] = model.topRightString
  484. dict["bottomLeftString"] = model.bottomLeftString
  485. dict["bottomCenterString"] = model.bottomCenterString
  486. dict["bottomRightString"] = model.bottomRightString
  487. /// 日期
  488. dict["dateFormatString"] = model.dateFormatString
  489. /// 页面
  490. dict["pageRangeString"] = model.pageRangeString
  491. dict["startString"] = model.startString
  492. /// 页面范围
  493. dict["pageRangeType"] = model.pageRangeType
  494. dict["pageRangeString"] = model.pageRangeString
  495. return dict
  496. }
  497. private func parseDictionary(dict: NSDictionary) -> KMHeaderFooterModel {
  498. let model = KMHeaderFooterModel()
  499. /// 字体相关
  500. model.textFont = .font(name: dict["fontName"] as! String, size: dict["fontSize"] as! CGFloat)
  501. model.textColor = .color(red: dict["red"] as! CGFloat, green: dict["green"] as! CGFloat, blue: dict["blue"] as! CGFloat, alpha: dict["alpha"] as! CGFloat)
  502. /// 页边距
  503. model.leftMargin = dict["leftMargin"] as! CGFloat
  504. model.rightMargin = dict["rightMargin"] as! CGFloat
  505. model.bottomMargin = dict["bottomMargin"] as! CGFloat
  506. model.topMargin = dict["topMargin"] as! CGFloat
  507. /// 内容
  508. model.topLeftString = dict["topLeftString"] as! String
  509. model.topCenterString = dict["topCenterString"] as! String
  510. model.topRightString = dict["topRightString"] as! String
  511. model.bottomLeftString = dict["bottomLeftString"] as! String
  512. model.bottomCenterString = dict["bottomCenterString"] as! String
  513. model.bottomRightString = dict["bottomRightString"] as! String
  514. /// 日期
  515. model.dateFormatString = dict["dateFormatString"] as! String
  516. /// 页面
  517. model.pageRangeString = dict["pageRangeString"] as! String
  518. model.startString = dict["startString"] as! String
  519. /// 页面范围
  520. model.pageRangeType = dict["pageRangeType"] as! Int
  521. model.pageRangeString = dict["pageRangeString"] as! String
  522. return model
  523. }
  524. private func tagString() -> String {
  525. var result: String = ""
  526. let dateFormatter = DateFormatter()
  527. dateFormatter.dateFormat = "yyMMddHHmmss"
  528. result.append(dateFormatter.string(from: Date()))
  529. result = result.appendingFormat("%04d", arc4random()%10000)
  530. return result
  531. }
  532. }