UIPickerView選擇位置(OC版)

iOS9使用UIPickerView地點(diǎn)選擇器

最近公司在做類似淘寶添加地址的位置選擇器,研究了一下,下面把實(shí)現(xiàn)過(guò)程分享出來(lái)提针。

1.首先演示下效果:

Simulator Screen Shot 2016年5月27日 上午11.52.27.png
Simulator Screen Shot 2016年5月27日 上午11.52.32.png

2.下面說(shuō)下實(shí)現(xiàn)過(guò)程:

  • 1.UIPickerView的用戶和TableView有點(diǎn)類似爬迟,都是通過(guò)實(shí)現(xiàn)代理方法和數(shù)據(jù)源方法實(shí)現(xiàn)的過(guò)程:UIPickerViewDataSource, UIPickerViewDelegate
  • 2.數(shù)據(jù)源方法主要有三個(gè),分別是設(shè)置有多少列驹溃,每列有多少行,每行的標(biāo)題,下面詳見(jiàn)代碼:
// 1.設(shè)置列的返回?cái)?shù)量
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 3;
}
// 2.設(shè)置列里邊組件的個(gè)數(shù) component:組件
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    //如果是第一列
    if (component == 0)
    {
        //返回省的個(gè)數(shù)
        return self.provinceArray.count;
    }
    //如果是第二列
    else if (component == 1)
    {
        //返回市的個(gè)數(shù)
        return self.cityArray.count;
    }
    else
    {
        //返回縣區(qū)的個(gè)數(shù)
        return self.countyArray.count;
    }
}

// 3.返回組件的標(biāo)題
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (component == 0) {
        // 設(shè)置第0列的標(biāo)題信息
        NSDictionary *provinceDict = [self.provinceArray objectAtIndex:row];
        NSString *name = provinceDict[@"n"];
        return name;
    } else if (component == 1) {
        // 設(shè)置第1列的標(biāo)題信息
        NSDictionary *cityDict = [self.cityArray objectAtIndex:row];
        NSString *name = cityDict[@"n"];
        return name;
    } else {
        // 設(shè)置第2列的標(biāo)題信息
        NSDictionary *countryDict = [self.countyArray objectAtIndex:row];
        NSString *name = countryDict[@"n"];
        return name;
    }
}

  • 3.這里數(shù)據(jù)我是放在本地的延曙,里面就是JSON文件豌鹤,我們將它轉(zhuǎn)換成數(shù)組或字典格式就行:
#pragma mark - 加載數(shù)據(jù)
- (void)loadData
{
    // 從MainBundle中加載文件
    NSString *path = [[NSBundle mainBundle] pathForResource:@"citylist" ofType:@"data"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSArray  *jsonArray = [NSJSONSerialization
                           JSONObjectWithData:data options:NSJSONReadingAllowFragments
                           error:nil];
    // 取出默認(rèn)的省市信息
    self.provinceArray = jsonArray;
    
    // 取出默認(rèn)的城市信息
    NSDictionary *provinceDict = [self.provinceArray firstObject];
    self.cityArray = provinceDict[@"l"];
    
    // 取出默認(rèn)的區(qū)信息
    NSDictionary *cityDict = [self.cityArray firstObject];
    self.countyArray = cityDict[@"l"];
}

  • 4.這里非常重要的一點(diǎn)就是,當(dāng)我們選擇某一列的某一行時(shí)枝缔,其他兩級(jí)需要刷新數(shù)據(jù)布疙,比如我們選中浙江省,那么對(duì)應(yīng)市和對(duì)應(yīng)區(qū)的數(shù)據(jù)需要刷新愿卸,下面詳見(jiàn)代碼:
//選擇器選擇的方法  row:被選中的行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    
    //選擇第0列執(zhí)行的方法
    if (component == 0) {
        [pickerView selectedRowInComponent:0];
        
        /**
         *  選中第0列時(shí)需要刷新第1列和第二列的數(shù)據(jù)
         */
        NSDictionary *provinceDict = [self.provinceArray objectAtIndex:row];
        self.cityArray = provinceDict[@"l"];
        [pickerView reloadComponent:1];
        
        NSDictionary *cityDict = [self.cityArray firstObject];
        self.countyArray = cityDict[@"l"];
        [pickerView reloadComponent:2];
        
    } else if (component == 1) {
        [pickerView selectedRowInComponent:1];
        
        /**
         *  選中第一列時(shí)需要刷新第二列的數(shù)據(jù)信息
         */
        NSDictionary *cityDict = [self.cityArray objectAtIndex:row];
        self.countyArray = cityDict[@"l"];
        [pickerView reloadComponent:2];
        
    } else if (component == 2) {
        [pickerView selectedRowInComponent:2];
        
    }
}

  • 5.到這里主要實(shí)現(xiàn)就已經(jīng)完成了灵临,我給TextField的輸出視圖加了個(gè)ToolBar,作為選中結(jié)果的確認(rèn):
// 作為T(mén)extField的彈出視圖的工具條
- (UIToolbar *)toolbar
{
    if (_toolbar == nil) {
        _toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 49)];
        
        UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStylePlain target:self action:@selector(cancel)];
        UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
        UIBarButtonItem *certain = [[UIBarButtonItem alloc] initWithTitle:@"確定" style:UIBarButtonItemStylePlain target:self action:@selector(certain)];

        _toolbar.items = @[cancel,flexibleSpace,certain];
    }
    return _toolbar;
}

// 點(diǎn)擊了取消
- (void)cancel
{
    [self.textField resignFirstResponder];
}

// 點(diǎn)擊了確定
- (void)certain
{
    // 獲取當(dāng)前選中的信息
    NSInteger proviceIndex = [self.pickerView selectedRowInComponent:0];
    NSInteger cityIndex = [self.pickerView selectedRowInComponent:1];
    NSInteger countryIndex = [self.pickerView selectedRowInComponent:2];

    NSString *provice = self.provinceArray[proviceIndex][@"n"];
    NSString *city = self.cityArray[cityIndex][@"n"];
    NSString *country = self.countyArray[countryIndex][@"n"];
    
    NSLog(@"%@,%@,%@",provice,city,country);
    
    // 彈出提示
    NSString *message = [NSString stringWithFormat:@"您選擇的是:%@-%@-%@",provice,city,country];
    
    UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:(UIAlertControllerStyleAlert)];
    
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        return;
    }];
    [alertVc addAction:cancel];
    
    [self presentViewController:alertVc animated:YES completion:nil];

}

3.示例代碼中我已經(jīng)對(duì)UIPickerView做了封裝趴荸,單獨(dú)抽取在CWPickerView類中儒溉,調(diào)用時(shí)直接初始化UIPickerView即可:

  • 調(diào)用CWPickerView
   CWPickerView *pickerView = [[CWPickerView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)];
    self.pickerView = pickerView;
    // 將pickerView作為UITextFiled的輸出View
    self.textField.inputView = pickerView;
  • 取出當(dāng)前選中的省市縣列表,這里我提供了一個(gè)對(duì)象方法獲取當(dāng)前選中的列表,返回的是一個(gè)字典
    // 獲取當(dāng)前選中的信息
    NSDictionary *info = [self.pickerView getCurrentSelectedInfo];
    // 獲取當(dāng)前選中的信息
    NSString *provice = info[@"province"];
    
    NSString *city = info[@"city"];
    
    NSString *country = info[@"country"];
    
    // 彈出提示
    NSString *message = [NSString stringWithFormat:@"您選擇的是:%@-%@-%@",provice,city,country];

4.到這里差不多就結(jié)束了发钝,如果有什么不對(duì)的地方顿涣,歡迎大家指正,如果對(duì)大家有幫助請(qǐng)給個(gè)喜歡或關(guān)注笼平,非常感謝园骆!下面附上代碼地址:

GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寓调,隨后出現(xiàn)的幾起案子锌唾,更是在濱河造成了極大的恐慌,老刑警劉巖夺英,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晌涕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痛悯,警方通過(guò)查閱死者的電腦和手機(jī)余黎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)载萌,“玉大人惧财,你說(shuō)我怎么就攤上這事巡扇。” “怎么了垮衷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵厅翔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我搀突,道長(zhǎng)刀闷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任仰迁,我火速辦了婚禮甸昏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐许。我一直安慰自己施蜜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布绊寻。 她就那樣靜靜地躺著花墩,像睡著了一般悬秉。 火紅的嫁衣襯著肌膚如雪澄步。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天和泌,我揣著相機(jī)與錄音村缸,去河邊找鬼。 笑死武氓,一個(gè)胖子當(dāng)著我的面吹牛梯皿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播县恕,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼东羹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了忠烛?” 一聲冷哼從身側(cè)響起属提,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎美尸,沒(méi)想到半個(gè)月后冤议,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡师坎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年恕酸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胯陋。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊温,死狀恐怖袱箱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情义矛,我是刑警寧澤犯眠,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站症革,受9級(jí)特大地震影響筐咧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜噪矛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一量蕊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艇挨,春花似錦残炮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脉漏,卻和暖如春苞冯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侧巨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工舅锄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人司忱。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓皇忿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坦仍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳍烁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容