请选择 进入手机版 | 继续访问电脑版

技术控

    今日:46| 主题:53290
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] iOS开发之城市选择器

[复制链接]
华丽的不敢触碰 发表于 2016-9-30 12:34:58
168 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
城市选择器,借助于UIPickerView来实现,第一列为省份,第二列为第一列省份对应的城市或者区,数据放在plist中,plist结构如下图所示,第一层是一个Dictionary,每个省份对应的城市是一个Array:
  

iOS开发之城市选择器

iOS开发之城市选择器

  实现步骤

  第一步

  拖入一个UIPickerView到StoryBoard中,然后设置UIPickerViewDelegate,和UIPickerViewDataSource为当前的控制器,如下图红色区域所示:
  

iOS开发之城市选择器

iOS开发之城市选择器

  设置数据源与代理.png
  第二步

  在对应的ViewController中进行实现,代码注释非常详细
  1. #import "ViewController.h"
  2. @interface ViewController ()
  3.   
  4.    
  5. /**
  6. *  plist对应的字典
  7. */
  8. @property (nonatomic, strong) NSDictionary* cityNames;
  9. /**
  10. *  省份
  11. */
  12. @property (nonatomic, strong) NSArray* provinces;
  13. /**
  14. *  城市
  15. */
  16. @property (nonatomic, strong) NSArray* cities;
  17. @end
  18. @implementation ViewController
  19. /**
  20. *  懒加载plist
  21. *
  22. *  @return plist对应的字典
  23. */
  24. - (NSDictionary*)cityNames
  25. {
  26.     if (_cityNames == nil) {
  27.         NSString* path = [[NSBundle mainBundle] pathForResource:@"cityData" ofType:@"plist"];
  28.         _cityNames = [NSDictionary dictionaryWithContentsOfFile:path];
  29.     }
  30.        return _cityNames;
  31. }
  32. /**
  33. *  懒加载省份
  34. *
  35. *  @return 省份对应的数组
  36. */
  37. -(NSArray *)provinces
  38. {
  39.     if (_provinces == nil) {
  40.         //将省份保存到数组中
  41.         _provinces = [self.cityNames allKeys];
  42.     }
  43.     return _provinces;
  44. }
  45. - (void)viewDidLoad
  46. {
  47.     [super viewDidLoad];
  48.     // Do any additional setup after loading the view, typically from a nib.
  49. }
  50. - (void)didReceiveMemoryWarning
  51. {
  52.     [super didReceiveMemoryWarning];
  53.     // Dispose of any resources that can be recreated.
  54. }
  55. /**
  56. *  返回每一列的行数
  57. *
  58. *  @param pickerView
  59. *  @param component
  60. *
  61. *  @return
  62. */
  63. - (NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component
  64. {
  65.     if (component == 0) {
  66.         return self.provinces.count;
  67.     }
  68.     else {
  69.         [self loadData:pickerView];
  70.         return self.cities.count;
  71.     }
  72. }
  73. /**
  74. *  返回每一行显示的文本
  75. *
  76. *  @param pickerView
  77. *  @param row
  78. *  @param component
  79. *
  80. *  @return
  81. */
  82. - (NSString*)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
  83. {
  84.     //第一列返回所有的省份
  85.     if (component == 0) {
  86.         return self.provinces[row];
  87.     }
  88.     else {
  89.         [self loadData:pickerView];
  90.         return self.cities[row];
  91.     }
  92. }
  93. /**
  94. *  加载第二列显示的数据
  95. *
  96. *  @param pickerView
  97. */
  98. -(void)loadData:(UIPickerView*)pickerView
  99. {
  100.     //一定要首先获取用户选择的那一行 然后才可以根据选中行获取省份 获取省份以后再去字典中加载省份对应的城市
  101.     NSInteger selRow = [pickerView selectedRowInComponent:0];
  102.     NSString *key = self.provinces[selRow];
  103.     self.cities = [self.cityNames valueForKey:key];
  104. }
  105. /**
  106. *  一共多少咧
  107. *
  108. *  @param pickerView
  109. *
  110. *  @return
  111. */
  112. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
  113. {
  114.     return 2;
  115. }
  116. /**
  117. *  选中某一行后回调 联动的关键
  118. *
  119. *  @param pickerView
  120. *  @param row        用户选择的省份
  121. *  @param component
  122. */
  123. - (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
  124. {
  125.     if (component == 0) {
  126.         //重新加载第二列的数据
  127.         [pickerView reloadComponent:1];
  128.         //让第二列归位
  129.         [pickerView selectRow:0 inComponent:1 animated:YES];
  130.     }
  131. }
  132. @end
  133.   
复制代码
实现效果

  

iOS开发之城市选择器

iOS开发之城市选择器

   文章转自 YungFan的简书



上一篇:Building Conversion Tracking at LinkedIn
下一篇:机器翻译十大经典论文
程蕴贤 发表于 2016-10-3 12:50:19
当时我去了虫坛,你却说你在微信
回复 支持 反对

使用道具 举报

含桃 发表于 2016-10-22 07:58:29
大神就是大神,这么经典!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )

© 2001-2017 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表