UIPickerView城市选择

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">我使用UIPickerView写了一个城市选择器,可是我发现在省份滚轮滚动的时候如果同时再滚动城市滚轮会崩溃,代码如下:</span><pre name="code" class="objc">@interface GLViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, strong) NSArray *provinces;

@property (nonatomic, weak) UIPickerView *pickerView;

@end

@implementation GLViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 1.创建pickerview
    // pickerview有默认的frame
    UIPickerView *pickerView = [[UIPickerView alloc] init];
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [self.view addSubview:pickerView];
    self.pickerView = pickerView;
}

#pragma mark - UIPickerViewDataSource
// 告诉系统有多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}
// 告诉系统有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (0 == component) {
        // 省份列
        return self.provinces.count;
    }else
    {
        // 城市列
        // 获取第0列选中的行
        NSInteger selectIndex = [self.pickerView selectedRowInComponent:0];
        // 1.根据第0列选中的行数获取对应的省
        NJProvince *province = self.provinces[selectIndex];
        // 2.获取对应省份对应的城市
        NSArray *cities = province.cities;
        // 3.返回城市的个数r
        return cities.count;
    }
}
#pragma mark - UIPickerViewDelegate
// 告诉系统每一行显示什么内容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSLog(@"titleForRow");

    if (0 == component) {
         // 省份
        // 1.获取对应行对应的省份模型
        NJProvince *province = self.provinces[row];
        // 2.返回省份的名称
        return province.name;
    }else
    {
         // 城市列
        // 0.获取第0列选中的行数
        NSInteger selectIndex = [pickerView selectedRowInComponent:0];
        // 1.获取对应的省份
        NJProvince *province = self.provinces[selectIndex];
        // 2.获取对应的城市
        return province.cities[row];
    }
}

// 监听pickerView的选中
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // 判断是否修改了第0列(省份列)
    if (0 == component) {
        // 刷新第1列对应的数据
        [pickerView reloadComponent:1];
        // 让第1列滚动到第0行
        [pickerView selectRow:0 inComponent:1 animated:YES];
    }
}

#pragma mark - 懒加载
- (NSArray *)provinces
{
    if (_provinces == nil) {
        //        加载资源
        NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]];
        //        转换为模型
        NSMutableArray *models = [NSMutableArray arrayWithCapacity:array.count];
        for (NSDictionary *dict in array) {
            NJProvince *province = [NJProvince provinceWithDictionary:dict];
            [models addObject:province];
        }
        _provinces = [models copy];
    }
    return _provinces;
}
@end

这个崩溃现象是由于省份滚轮在滚动过程中[pickerView selectedRowInComponent]一直在变化,而代理方法-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component只有在滚轮停止滚动式才会调用,所以在滚动城市取数据过程中出现的数组越界,于是我用了另一种写法:

@interface TCityPickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, weak) UIPickerView *pickerView;
@property (nonatomic, strong) NSArray *citiesArray;
@property (nonatomic, assign) NSInteger provinceIndex;
@end

@implementation TCityPickerView

#pragma mark - public
+ (instancetype)cityPickerView {
    TCityPickerView *pickerView = [[TCityPickerView alloc] init];
    pickerView.backgroundColor = kColorBarBg;
    pickerView.show = NO;
    pickerView.frame = CGRectMake(0, kScreenHeight - 64, kScreenWidth, 244);
    [pickerView hiddenPickerView];
    return pickerView;
}

#pragma mark - lazy
- (NSArray *)citysArray {
    if (!_citiesArray) {
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cities.plist" ofType:nil];
        _citiesArray = [NSArray arrayWithContentsOfFile:filePath];
    }
    return _citiesArray;
}    

#pragma mark - init
- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {

        self.provinceIndex = 0;
        [self initSubViews];
    }
    return self;
}

- (void)initSubViews {
    UIPickerView *picker = [[UIPickerView alloc] init];
    picker.dataSource = self;
    picker.delegate = self;
    [self addSubview:picker];
    self.pickerView = picker;
    }

#pragma mark - UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if (component == 0) {
        return self.citysArray.count;
    } else {
        return [self.citysArray[self.provinceIndex][@"cities"] count];
    }
}

#pragma mark - UIPickerViewDelegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString *title = nil;
    if (component == 0) {
        title = self.citysArray[row][@"name"];
    } else {
        title = self.citysArray[self.provinceIndex][@"cities"][row];
    }
    return title;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

    if (component == 0) {
        self.provinceIndex = [pickerView selectedRowInComponent:0];
        [self.pickerView reloadComponent:1];
        [self.pickerView selectRow:0 inComponent:1 animated:YES];
    }

}

@end
				
时间: 2024-07-30 10:08:35

UIPickerView城市选择的相关文章

UIPickerView的简单应用——省份/城市选择的实现

UIPickerView的简单应用--省份/城市选择的实现 实现效果如图,左边为省份选择,右边选择省份对应的城市 数据plist形式如图 工程下载地址:工程下载 https://github.com/Nongchaozhe/UIPickerView-Province-city UIPickerView的实现重要还是两个代理协议中方法的实现 - (void)viewDidLoad { [super viewDidLoad]; [self loadData]; _pickView = [[UIPic

UIPickerView简单应用——省份/城市选择实现

UIPickerView的简单应用--省份/城市选择的实现 实现效果如图,左边为省份选择,右边选择省份对应的城市 数据plist形式如图 工程下载地址:工程下载 https://github.com/Nongchaozhe/UIPickerView-Province-city UIPickerView的实现重要还是两个代理协议中方法的实现 - (void)viewDidLoad { [super viewDidLoad]; [self loadData]; _pickView = [[UIPic

类似于铁道部12306的城市选择框的实现

第一次写,有点小紧张... 这两天研究铁道部的余票查询系统,参考网上大牛们的经典案例,也有了一些自己的心得,写在自己程序猿的道路上记录一下,也和大家一起分享,写的不好莫怪,大牛可以自动过滤,非喜勿喷,谢谢~ 今天先简单的介绍一下城市选择框的实现,与12306官网有一点差距,上图,先看看效果:      如图所示,支持拼音首字母查询,全拼音查询,汉字查询等 好了,现在谈一谈我是怎么实现的 首先是准备工作: 我们需要把城市的信息存入我们的数据库中,城市数据来源:https://kyfw.12306.

仿拉手团购App2--当前城市选择Activity

首页中点击城市TextView调转到当前城市选择Activity fragment_city.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background=&quo

【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row

从这篇文章开始我将会把每天在开发过程中遇到的,可以用很短的文章.很小的demo演示解释出来的小心得小技巧,分享在[iOS开发每日小笔记]这个分类中.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们会给用户体验.代码效率得到一些提升,记录在这里,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,可以选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论里狠狠吐槽,再关掉页面!感谢! 今天在项目中遇到这样一个小问题:我使用UI

联动城市选择插件

index.html <!DOCTYPE html><html lang="en"> <head>    <meta charset="UTF-8">    <title>kuCity</title>    <link rel="stylesheet" href="kuCity.css">    <style>    .search

基于jquery的城市选择插件

城市选择插件的难度不是很大,主要是对dom节点的操作.而我写的这个插件相对功能比较简答,没有加入省市联动. 上代码好了,参照代码的注释应该比较好理解. 1 /* 2 *基于jquery的城市选择插件 3 *author:youziclub 4 *2015-4-22 5 */ 6 ;(function($){ 7 $.fn.city=function(options){ 8 // 城市信息 9 var nav=['热门','A-G','H-L','M-T','W-Z','其他']; 10 var

移动端城市选择JavaScript插件(基于WG的城市选择插件的修改版本)

周末的时候趁着一次机会,拿WG(博客)开发的城市选择插件改了一个移动端可以直接用的城市选择插件. 原版插件是基于原声JavaScript写的,在此先感谢作者. 我做的只是依照肯德基注册会员的页面的交互效果改了一下界面,同时将各个触发效果改成了跟肯德基注册页面类似的交互效果,源程序不依赖jQuery但是我自己做简单的交互的时候偷懒使用了jQuery所以,如果您要使用这个插件完全可以换掉我写的那一些事件注册. 详细的因为我并没有大改,所以也就不po细节了,具体的项目代码我贴在这里. https://

android wheelview实现三级城市选择

很早之前看淘宝就有了ios那种的城市选择控件,当时也看到网友有分享,不过那个写的很烂,后来(大概是去年吧),我们公司有这么一个项目,当时用的还是网上比较流行的那个黑框的那个,感觉特别的丑,然后我在那个开源的wheelview的基础上做封装,用户只需要专心数据的组装即可,然后填充就行,其他的可以不必考虑. 先上下效果图 接下来说下我的思路:网络请求-数据返回-设置数据-数据填充控件 接下来直接按上面的流程直接上代码: 网络请求我用的本地的json数据 String address = Utils.