GFAddressPicker.m 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. //
  2. // GFAddressPicker.m
  3. // 地址选择器
  4. //
  5. // Created by 1暖通商城 on 2017/5/10.
  6. // Copyright © 2017年 1暖通商城. All rights reserved.
  7. //
  8. #import "GFAddressPicker.h"
  9. @interface GFAddressPicker ()<UIPickerViewDelegate,UIPickerViewDataSource>
  10. @property (strong, nonatomic) NSDictionary *pickerDic;
  11. @property (strong, nonatomic) NSArray *selectedArray;
  12. @property (strong, nonatomic) NSArray *provinceArray;
  13. @property (strong, nonatomic) NSArray *cityArray;
  14. @property (strong, nonatomic) NSArray *townArray;
  15. @property (strong, nonatomic) UIPickerView *pickView;
  16. @end
  17. @implementation GFAddressPicker
  18. - (instancetype)initWithFrame:(CGRect)frame
  19. {
  20. self = [super initWithFrame:frame];
  21. if (self) {
  22. self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
  23. [self getAddressInformation];
  24. [self setBaseView];
  25. }
  26. return self;
  27. }
  28. - (void)getAddressInformation {
  29. NSString *path = [[NSBundle mainBundle] pathForResource:@"Address" ofType:@"plist"];
  30. self.pickerDic = [[NSDictionary alloc] initWithContentsOfFile:path];
  31. self.provinceArray = [self.pickerDic allKeys];
  32. self.selectedArray = [self.pickerDic objectForKey:[[self.pickerDic allKeys] objectAtIndex:0]];
  33. if (self.selectedArray.count > 0) {
  34. self.cityArray = [[self.selectedArray objectAtIndex:0] allKeys];
  35. }
  36. if (self.cityArray.count > 0) {
  37. self.townArray = [[self.selectedArray objectAtIndex:0] objectForKey:[self.cityArray objectAtIndex:0]];
  38. }
  39. }
  40. - (void)setBaseView {
  41. CGFloat height = self.frame.size.height;
  42. CGFloat width = self.frame.size.width;
  43. UIColor *color = [UIColor colorWithRed:242/255.0 green:243/255.0 blue:249/255.0 alpha:1];
  44. UIColor *btnColor = [UIColor colorWithRed:65.0/255 green:164.0/255 blue:249.0/255 alpha:1];
  45. UIView *selectView = [[UIView alloc] initWithFrame:CGRectMake(0, height - 210, width, 30)];
  46. selectView.backgroundColor = color;
  47. UIButton *cancleBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  48. [cancleBtn setTitle:@"取消" forState:0];
  49. [cancleBtn setTitleColor:btnColor forState:0];
  50. cancleBtn.frame = CGRectMake(0, 0, 60, 40);
  51. [cancleBtn addTarget:self action:@selector(dateCancleAction) forControlEvents:UIControlEventTouchUpInside];
  52. [selectView addSubview:cancleBtn];
  53. UIButton *ensureBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  54. [ensureBtn setTitle:@"确定" forState:0];
  55. [ensureBtn setTitleColor:btnColor forState:0];
  56. ensureBtn.frame = CGRectMake(width - 60, 0, 60, 40);
  57. [ensureBtn addTarget:self action:@selector(dateEnsureAction) forControlEvents:UIControlEventTouchUpInside];
  58. [selectView addSubview:ensureBtn];
  59. [self addSubview:selectView];
  60. self.pickView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, height - 180 , width, 180)];
  61. self.pickView.delegate = self;
  62. self.pickView.dataSource = self;
  63. self.pickView.backgroundColor = color;
  64. [self addSubview:self.pickView];
  65. [self.pickView reloadAllComponents];
  66. [self updateAddress];
  67. }
  68. - (void)updateAddressAtProvince:(NSString *)province city:(NSString *)city town:(NSString *)town {
  69. self.province = province;
  70. self.city = city;
  71. self.area = town;
  72. if (self.province) {
  73. for (NSInteger i = 0; i < self.provinceArray.count; i++) {
  74. NSString *city = self.provinceArray[i];
  75. NSInteger select = 0;
  76. if ([city isEqualToString:self.province]) {
  77. select = i;
  78. [self.pickView selectRow:i inComponent:0 animated:YES];
  79. break;
  80. }
  81. }
  82. self.cityArray = [self.pickerDic[self.province][0] allKeys];
  83. for (NSInteger i = 0; i < self.cityArray.count; i++) {
  84. NSString *city = self.cityArray[i];
  85. if ([city isEqualToString:self.city]) {
  86. [self.pickView selectRow:i inComponent:1 animated:YES];
  87. break;
  88. }
  89. }
  90. self.townArray = self.pickerDic[self.province][0][self.city];
  91. for (NSInteger i = 0; i < self.townArray.count; i++) {
  92. NSString *town = self.townArray[i];
  93. if ([town isEqualToString:self.area]) {
  94. [self.pickView selectRow:i inComponent:2 animated:YES];
  95. break;
  96. }
  97. }
  98. }
  99. [self.pickView reloadAllComponents];
  100. [self updateAddress];
  101. }
  102. - (void)dateCancleAction {
  103. if (self.delegate && [self.delegate respondsToSelector:@selector(GFAddressPickerCancleAction)]) {
  104. [self.delegate GFAddressPickerCancleAction];
  105. }
  106. }
  107. - (void)dateEnsureAction {
  108. if (self.delegate && [self.delegate respondsToSelector:@selector(GFAddressPickerWithProvince:city:area:)]) {
  109. [self.delegate GFAddressPickerWithProvince:self.province city:self.city area:self.area];
  110. }
  111. }
  112. - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
  113. UILabel* pickerLabel = (UILabel*)view;
  114. if (!pickerLabel){
  115. pickerLabel = [[UILabel alloc] init];
  116. pickerLabel.adjustsFontSizeToFitWidth = YES;
  117. pickerLabel.textAlignment = NSTextAlignmentCenter;
  118. [pickerLabel setBackgroundColor:[UIColor clearColor]];
  119. [pickerLabel setFont:self.font?:[UIFont boldSystemFontOfSize:14]];
  120. }
  121. pickerLabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];
  122. return pickerLabel;
  123. }
  124. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
  125. return 3;
  126. }
  127. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  128. if (component == 0) {
  129. return self.provinceArray.count;
  130. } else if (component == 1) {
  131. return self.cityArray.count;
  132. } else {
  133. return self.townArray.count;
  134. }
  135. }
  136. - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
  137. if (component == 0) {
  138. return [self.provinceArray objectAtIndex:row];
  139. } else if (component == 1) {
  140. return [self.cityArray objectAtIndex:row];
  141. } else {
  142. return [self.townArray objectAtIndex:row];
  143. }
  144. }
  145. - (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
  146. return self.frame.size.width / 3;
  147. }
  148. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  149. if (component == 0) {
  150. self.selectedArray = [self.pickerDic objectForKey:[self.provinceArray objectAtIndex:row]];
  151. if (self.selectedArray.count > 0) {
  152. self.cityArray = [[self.selectedArray objectAtIndex:0] allKeys];
  153. } else {
  154. self.cityArray = @[];
  155. }
  156. if (self.cityArray.count > 0) {
  157. self.townArray = [[self.selectedArray objectAtIndex:0] objectForKey:[self.cityArray objectAtIndex:0]];
  158. } else {
  159. self.townArray = @[];
  160. }
  161. [pickerView reloadComponent:1];
  162. [pickerView selectedRowInComponent:1];
  163. [pickerView reloadComponent:2];
  164. [pickerView selectedRowInComponent:2];
  165. }
  166. if (component == 1) {
  167. self.selectedArray = [self.pickerDic objectForKey:[self.provinceArray objectAtIndex:[self.pickView selectedRowInComponent:0]]];
  168. NSDictionary *dic = self.selectedArray.firstObject;
  169. NSString *stirng = self.cityArray[row];
  170. for (NSString *string in dic.allKeys) {
  171. if ([stirng isEqualToString:string]) {
  172. self.townArray = dic[string];
  173. }
  174. }
  175. [pickerView reloadComponent:2];
  176. [pickerView selectedRowInComponent:2];
  177. }
  178. if (component == 2) {
  179. [pickerView reloadComponent:2];
  180. [pickerView selectedRowInComponent:2];
  181. }
  182. [self updateAddress];
  183. }
  184. - (void)updateAddress {
  185. self.province = [self.provinceArray objectAtIndex:[self.pickView selectedRowInComponent:0]];
  186. self.city = [self.cityArray objectAtIndex:[self.pickView selectedRowInComponent:1]];
  187. self.area = [self.townArray objectAtIndex:[self.pickView selectedRowInComponent:2]];
  188. }
  189. /*
  190. // Only override drawRect: if you perform custom drawing.
  191. // An empty implementation adversely affects performance during animation.
  192. - (void)drawRect:(CGRect)rect {
  193. // Drawing code
  194. }
  195. */
  196. @end