JCAreaPickerView.swift 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. //
  2. // JCAreaPickerView.swift
  3. // JChat
  4. //
  5. // Created by deng on 2017/5/3.
  6. // Copyright © 2017年 dengyonghao. All rights reserved.
  7. //
  8. import UIKit
  9. let stateKey = "state"
  10. let citiesKey = "cities"
  11. let cityKey = "city"
  12. let areasKey = "areas"
  13. enum JCAreaPickerType: Int {
  14. case province
  15. case city
  16. case area
  17. }
  18. @objc public protocol JCAreaPickerViewDelegate: NSObjectProtocol {
  19. @objc optional func areaPickerView(_ areaPickerView: JCAreaPickerView, didSelect button: UIButton, selectLocate locate: JCLocation)
  20. @objc optional func areaPickerView(_ areaPickerView: JCAreaPickerView, cancleSelect button: UIButton)
  21. }
  22. @objc(JCAreaPickerView)
  23. public class JCAreaPickerView: UIView {
  24. weak var delegate: JCAreaPickerViewDelegate?
  25. fileprivate var cities = [[String: AnyObject]]()
  26. fileprivate var areas = [String]()
  27. fileprivate var pickerView: UIPickerView!
  28. override init(frame: CGRect) {
  29. super.init(frame: frame)
  30. let toolView = UIView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: 40))
  31. toolView.backgroundColor = .white
  32. let line = UILabel(frame: CGRect(x: 0, y: toolView.frame.size.height - 0.5 , width: toolView.frame.size.width, height: toolView.frame.size.height - 0.5))
  33. line.backgroundColor = UIColor(netHex: 0x999999)
  34. toolView.addSubview(line)
  35. let cancelButton = UIButton(frame: CGRect(x: 15, y: 0, width: 50, height: 39.5))
  36. cancelButton.setTitle("取消", for: .normal)
  37. cancelButton.setTitleColor(.black, for: .normal)
  38. cancelButton.addTarget(self, action: #selector(_areaPickerCancel), for: .touchUpInside)
  39. let sureButton = UIButton(frame: CGRect(x: toolView.frame.size.width - 50 - 15, y: 0, width: 50, height: 39.5))
  40. sureButton.setTitle("确定", for: .normal)
  41. sureButton.setTitleColor(.black, for: .normal)
  42. sureButton.addTarget(self, action: #selector(_areaPickerSure), for: .touchUpInside)
  43. toolView.addSubview(cancelButton)
  44. toolView.addSubview(sureButton)
  45. addSubview(toolView)
  46. pickerView = UIPickerView(frame: CGRect(x: 0, y: 40, width: frame.size.width, height: frame.size.height - 40))
  47. pickerView.backgroundColor = .white
  48. pickerView.delegate = self
  49. pickerView.dataSource = self
  50. addSubview(pickerView)
  51. cities = provinces[0][citiesKey] as! [[String : AnyObject]]!
  52. if let province = provinces[0][stateKey] as? String {
  53. locate.province = province
  54. }
  55. if let city = cities[0][cityKey] as? String {
  56. locate.city = city
  57. }
  58. areas = cities[0][areasKey] as! [String]!
  59. if areas.count > 0 {
  60. locate.area = areas[0]
  61. } else {
  62. locate.area = ""
  63. }
  64. }
  65. required public init?(coder aDecoder: NSCoder) {
  66. fatalError("init(coder:) has not been implemented")
  67. }
  68. func _areaPickerCancel(_ sender: UIButton) {
  69. delegate?.areaPickerView?(self, cancleSelect: sender)
  70. }
  71. func _areaPickerSure(_ sender: UIButton) {
  72. delegate?.areaPickerView?(self, didSelect: sender, selectLocate: locate)
  73. }
  74. func shouldSelected(proName: String, cityName: String, areaName: String?) {
  75. for index in 0..<provinces.count {
  76. let pro = provinces[index]
  77. if pro[stateKey] as! String == proName {
  78. cities = provinces[index][citiesKey] as! [[String : AnyObject]]!
  79. if let province = provinces[index][stateKey] as? String {
  80. locate.province = province
  81. }
  82. pickerView.selectRow(index, inComponent: JCAreaPickerType.province.rawValue, animated: false)
  83. break
  84. }
  85. }
  86. for index in 0..<cities.count {
  87. let city = cities[index]
  88. if city[cityKey] as! String == cityName {
  89. if let city = cities[index][cityKey] as? String {
  90. locate.city = city
  91. }
  92. areas = cities[index][areasKey] as! [String]!
  93. pickerView.selectRow(index, inComponent: JCAreaPickerType.city.rawValue, animated: false)
  94. break
  95. }
  96. }
  97. if areaName != nil {
  98. for (index, name) in areas.enumerated() {
  99. if name == areaName! {
  100. locate.area = areas[index]
  101. pickerView.reloadAllComponents()
  102. pickerView.selectRow(index, inComponent: JCAreaPickerType.area.rawValue, animated: false)
  103. break
  104. }
  105. }
  106. }
  107. }
  108. func setCode(provinceName: String, cityName: String, areaName: String?){
  109. let url = Bundle.main.url(forResource: "addressCode", withExtension: nil)
  110. let data = try! Data(contentsOf: url!)
  111. let dict = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: AnyObject]
  112. let provinces = dict["p"] as! [[String: AnyObject]]
  113. for pro in provinces {
  114. if pro["n"] as! String == provinceName {
  115. if let proCode = pro["v"] as? String {
  116. locate.provinceCode = proCode //找到省编号
  117. }
  118. var foundCity = false
  119. for city in pro["c"] as! [[String: AnyObject]] {
  120. if city["n"] as! String == cityName {
  121. if let cityCode = city["v"] as? String {
  122. locate.cityCode = cityCode //找到城市编码
  123. }
  124. for area in city["d"] as! [[String: String]] {
  125. if area["n"] == areaName {
  126. locate.areaCode = area["v"]!
  127. }
  128. }
  129. foundCity = true
  130. }
  131. }
  132. //如果第二层没有找到相应的城市.那就是直辖市了,要重新找
  133. if !foundCity {
  134. for city in pro["c"] as! [[String: AnyObject]] {
  135. let areas = city["d"] as! [[String: String]] //直接查找三级区域
  136. for area in areas {
  137. if area["n"] == cityName {
  138. locate.areaCode = area["v"]!
  139. if let cityCode = city["v"] as? String {
  140. locate.cityCode = cityCode
  141. }
  142. break
  143. }
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }
  150. // MARK: - lazy
  151. lazy var provinces: [[String: AnyObject]] = {
  152. let path = Bundle.main.path(forResource: "area", ofType: "plist")
  153. return NSArray(contentsOfFile: path!) as! [[String: AnyObject]]
  154. }()
  155. lazy var locate: JCLocation = {
  156. return JCLocation()
  157. }()
  158. }
  159. extension JCAreaPickerView: UIPickerViewDelegate, UIPickerViewDataSource {
  160. public func numberOfComponents(in pickerView: UIPickerView) -> Int {
  161. return 3
  162. }
  163. public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
  164. let pickerType = JCAreaPickerType(rawValue: component)!
  165. switch pickerType {
  166. case .province:
  167. return provinces.count
  168. case .city:
  169. return cities.count
  170. case .area:
  171. return areas.count
  172. }
  173. }
  174. public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
  175. let pickerType = JCAreaPickerType(rawValue: component)!
  176. switch pickerType {
  177. case .province:
  178. return provinces[row][stateKey] as! String?
  179. case .city:
  180. return cities[row][cityKey] as! String?
  181. case .area:
  182. if areas.count > 0 {
  183. return areas[row]
  184. } else {
  185. return ""
  186. }
  187. }
  188. }
  189. public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
  190. let pickerType = JCAreaPickerType(rawValue: component)!
  191. switch pickerType {
  192. case .province:
  193. cities = provinces[row][citiesKey] as! [[String : AnyObject]]!
  194. pickerView.reloadComponent(JCAreaPickerType.city.rawValue)
  195. pickerView.selectRow(0, inComponent: JCAreaPickerType.city.rawValue, animated: true)
  196. reloadAreaComponent(pickerView: pickerView, row: 0)
  197. if let province = provinces[row][stateKey] as? String {
  198. locate.province = province
  199. }
  200. case .city:
  201. reloadAreaComponent(pickerView: pickerView, row: row)
  202. case .area:
  203. if areas.count > 0 {
  204. locate.area = areas[row]
  205. } else {
  206. locate.area = ""
  207. }
  208. }
  209. setCode(provinceName: locate.province, cityName: locate.city, areaName: locate.area)
  210. }
  211. func reloadAreaComponent(pickerView: UIPickerView, row: Int) {
  212. guard row <= cities.count - 1 else {
  213. return
  214. }
  215. areas = cities[row][areasKey] as! [String]!
  216. pickerView.reloadComponent(JCAreaPickerType.area.rawValue)
  217. pickerView.selectRow(0, inComponent: JCAreaPickerType.area.rawValue, animated: true)
  218. if let city = cities[row][cityKey] as? String {
  219. locate.city = city
  220. }
  221. if areas.count > 0 {
  222. locate.area = areas[0]
  223. } else {
  224. locate.area = ""
  225. }
  226. }
  227. }