iOS UIPickerView的使用---自定義時(shí)間選擇器

概述

自定義時(shí)間選擇器,難點(diǎn)在于時(shí)間數(shù)據(jù)的獲取,主要是在時(shí)間進(jìn)位的時(shí)候,數(shù)據(jù)可能會(huì)大范圍的改變,列如:
在59分時(shí),進(jìn)位后下一分鐘是0分,此時(shí)小時(shí)值會(huì)加1,如果上一分鐘小時(shí)數(shù)為23,則小時(shí)數(shù)據(jù)進(jìn)位后變成第二天的0點(diǎn),如果上一分鐘天數(shù)是月底最后一天,則進(jìn)位后月份也會(huì)跟著進(jìn)位加1,如果上一分鐘月份數(shù)為12,則進(jìn)位后月份數(shù)會(huì)變成1月,此時(shí)年份數(shù)加1。
另外一個(gè)注意事項(xiàng)是,時(shí)間是時(shí)時(shí)刻變化的,所以要保證時(shí)間選擇器上的數(shù)據(jù)正確有效,需要讓它過(guò)一段時(shí)間間隔就刷新重新獲取數(shù)據(jù),然后刷新控件

界面效果圖

代碼

數(shù)據(jù)獲取的關(guān)鍵代碼
-(void)getData{
    /*
     獲取時(shí)間數(shù)據(jù)分為兩種情況,一種是常規(guī)數(shù)據(jù),如一個(gè)月28/29/30/31天,一天24小時(shí),一小時(shí)60分鐘等,這個(gè)數(shù)據(jù)很好獲取
     另一種情況是當(dāng)前的數(shù)據(jù),當(dāng)前時(shí)間數(shù)據(jù)比較復(fù)雜,前提條件:分鐘只需要取10鐘一間隔得數(shù)據(jù)即:0、10、20、30、40、50,這樣獲取數(shù)據(jù)的時(shí)候需要在當(dāng)前時(shí)間加10分鐘,這樣的話(huà) 在50~59分,小時(shí)數(shù)據(jù)是沒(méi)有當(dāng)前的小時(shí)值可選的;在23時(shí)50~59分,當(dāng)前天數(shù)是不可選的;在每月的最后一天和每年的最后一天都有類(lèi)似的特殊情況,同時(shí)需要每個(gè)一分鐘更新一次當(dāng)前的時(shí)間的數(shù)據(jù)
     */
    //在當(dāng)前時(shí)間加10分鐘,然后獲取年月日時(shí)分的值
    NSDate * date = [NSDate dateWithTimeIntervalSinceNow:60*10];//提前10分鐘
    NSCalendar * canlendar = [NSCalendar currentCalendar];
    NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents * components = [canlendar components:unitFlags fromDate:date];
    NSInteger nowY = [components year];
    NSInteger nowM = [components month];
    NSInteger nowD = [components day];
    NSInteger nowH = [components hour];
    NSInteger nowF = [components minute];
    //給當(dāng)前值賦值--這些值主要是用于時(shí)間選擇器的第一次打開(kāi)時(shí)顯示當(dāng)前時(shí)間
    self.defaultYear = [components year];
    self.defaultMonth = [components month];
    self.defaultDay = [components day];
    self.defaultHour = [components hour];
    NSLog(@"%ld",[components minute]);
    self.defaultMinute = ([components minute]/10)*10 ;
    //獲取當(dāng)前月的天數(shù)
    NSRange range = [canlendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
    NSUInteger numberOfDaysInMonth = range.length;
    NSMutableArray * nowPickerViewDataArr0 = [[NSMutableArray alloc] init];
    NSMutableArray * nowPickerViewDataArr1 = [[NSMutableArray alloc] init];
    NSMutableArray * nowPickerViewDataArr2 = [[NSMutableArray alloc] init];
    NSMutableArray * nowPickerViewDataArr3 = [[NSMutableArray alloc] init];
    NSMutableArray * nowPickerViewDataArr4 = [[NSMutableArray alloc] init];
    //獲取當(dāng)前分鐘數(shù)
    if (nowF >= 50) {//大于50分到59之間分鐘數(shù)需要特殊處理
        self.defaultMinute = 0;
        self.defaultHour+=1;
        if (self.defaultHour == 24) {
            self.defaultHour = 0;
        }
        for (int i = 0; i < 6; i++) {
            [nowPickerViewDataArr4 addObject:[NSNumber numberWithInteger:i*10]];
        }
    }else{//小于50分,則只獲取當(dāng)前可選的分鐘值
        for (NSInteger i = self.defaultMinute/10; i < 6; i++) {
            [nowPickerViewDataArr4 addObject:[NSNumber numberWithInteger:i*10]];
        }
    }
    //獲取當(dāng)前小時(shí)數(shù)
    if (nowH >= 23&&nowH>=50) {//23點(diǎn)50分到59之間,當(dāng)前小時(shí)數(shù)需要特殊處理
        self.defaultHour+=1;
        self.defaultDay+=1;
        if (self.defaultDay >numberOfDaysInMonth) {
            self.defaultDay = 1;
        }
        for (int i = 0; i < 24; i++) {
            [nowPickerViewDataArr3 addObject:[NSNumber numberWithInteger:i]];
        }
    }else{//
        for (NSInteger i = self.defaultHour; i < 24; i++) {
            [nowPickerViewDataArr3 addObject:[NSNumber numberWithInteger:i]];
        }
    }
    //獲取當(dāng)前日數(shù)
    if (nowD >= numberOfDaysInMonth&&nowH >= 23&&nowH>=50) {//每月最后一天23點(diǎn)50分到59之間,當(dāng)前小時(shí)數(shù)需要特殊處理
        self.defaultDay+=1;
        self.defaultMonth+=1;
        if (self.defaultMonth >12) {
            self.defaultMonth = 1;
        }
        for (int i = 1; i <= numberOfDaysInMonth; i++) {
            [nowPickerViewDataArr2 addObject:[NSNumber numberWithInteger:i]];
        }
    }else{//
        for (NSInteger i = self.defaultDay; i <= numberOfDaysInMonth; i++) {
            [nowPickerViewDataArr2 addObject:[NSNumber numberWithInteger:i]];
        }
    }
    //獲取當(dāng)前月份數(shù)
    if (nowM >= 12&&nowD >= numberOfDaysInMonth&&nowH >= 23&&nowH>=50) {//每年12月最后一天23點(diǎn)50分到59之間,當(dāng)前小時(shí)數(shù)需要特殊處理
        self.defaultMonth+=1;
        self.defaultYear+=1;
        if (self.defaultYear >nowY) {
            self.defaultYear = nowY+1;
        }
        for (int i = 1; i <= 12; i++) {
            [nowPickerViewDataArr1 addObject:[NSNumber numberWithInteger:i]];
        }
    }else{//
        for (NSInteger i = self.defaultMonth; i <= 12; i++) {
            [nowPickerViewDataArr1 addObject:[NSNumber numberWithInteger:i]];
        }
    }
    //獲取年份
    for (int i = 0; i < 3; i++) {
        [nowPickerViewDataArr0 addObject:[NSNumber numberWithInteger:i+self.defaultYear]];
    }
    //將當(dāng)前時(shí)間的數(shù)據(jù)存到數(shù)組
    [self.nowPickerViewDataArr addObject:nowPickerViewDataArr0];
    [self.nowPickerViewDataArr addObject:nowPickerViewDataArr1];
    [self.nowPickerViewDataArr addObject:nowPickerViewDataArr2];
    [self.nowPickerViewDataArr addObject:nowPickerViewDataArr3];
    [self.nowPickerViewDataArr addObject:nowPickerViewDataArr4];
    //獲取常規(guī)數(shù)值
    NSMutableArray * pickerViewDataArr1 = [[NSMutableArray alloc] init];
    NSMutableArray * pickerViewDataArr2 = [[NSMutableArray alloc] init];
    NSMutableArray * pickerViewDataArr3 = [[NSMutableArray alloc] init];
    NSMutableArray * pickerViewDataArr4 = [[NSMutableArray alloc] init];
    //分鐘
    for (int i = 0; i < 6; i++) {
        [pickerViewDataArr4 addObject:[NSNumber numberWithInteger:i*10]];
    }
    //小時(shí)
    for (NSInteger i = 0; i < 24; i++) {
        [pickerViewDataArr3 addObject:[NSNumber numberWithInteger:i]];
    }
    //天數(shù)
    for (NSInteger i = 1; i <= numberOfDaysInMonth; i++) {
        [pickerViewDataArr2 addObject:[NSNumber numberWithInteger:i]];
    }
    //月數(shù)
    for (NSInteger i = 1; i <= 12; i++) {
        [pickerViewDataArr1 addObject:[NSNumber numberWithInteger:i]];
    }
    [self.pickerViewDataArr addObject:nowPickerViewDataArr0];
    [self.pickerViewDataArr addObject:pickerViewDataArr1];
    [self.pickerViewDataArr addObject:pickerViewDataArr2];
    [self.pickerViewDataArr addObject:pickerViewDataArr3];
    [self.pickerViewDataArr addObject:pickerViewDataArr4];
}
pickerView返回行數(shù)的代理方法關(guān)鍵代碼
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    if (component == 0) {
        return [self.nowPickerViewDataArr[0] count];
    } else if(component == 1){
        if (self.selectRow0 == 0) {
            return [self.nowPickerViewDataArr[1] count];
        } else {
            return [self.pickerViewDataArr[1] count];
        }
    }else if (component ==2){
        if (self.selectRow0 == 0&&self.selectRow1 == 0) {
            return [self.nowPickerViewDataArr[2] count];
        } else {
            return [self.pickerViewDataArr[2] count];
        }
    }else if (component == 3){
        if (self.selectRow2 == 0&&self.selectRow1 == 0&&self.selectRow0 == 0) {
            return [self.nowPickerViewDataArr[3] count];
        } else {
            return [self.pickerViewDataArr[3] count];
        }
    }else{
        if (self.selectRow3 ==0&&self.selectRow2 == 0&&self.selectRow1 == 0&&self.selectRow0 == 0) {
            return [self.nowPickerViewDataArr[4] count];
        } else {
            return [self.pickerViewDataArr[4] count];
        }
    }
}
pickerView返回顯示值的代理方法關(guān)鍵代碼
-(UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
    //添加一個(gè)label
    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth/5, 30)];
    label.textColor = [UIColor grayColor];
    label.font = [UIFont systemFontOfSize:15];
    label.textAlignment = NSTextAlignmentLeft;
    //對(duì)每一列都需要做特殊和非特殊的判斷,一遍給到正確的值
    if (component == 0) {
        label.text = [NSString stringWithFormat:@"%@",self.nowPickerViewDataArr[0][row]];
    } else if(component == 1){
        if (self.selectRow0 == 0) {
            label.text = [NSString stringWithFormat:@"%@",self.nowPickerViewDataArr[1][row]];
        } else {
            label.text = [NSString stringWithFormat:@"%@",self.pickerViewDataArr[1][row]];
        }
    }else if (component ==2){
        if (self.selectRow0 == 0&&self.selectRow1 == 0) {
            label.text = [NSString stringWithFormat:@"%@",self.nowPickerViewDataArr[2][row]];
        } else {
            label.text = [NSString stringWithFormat:@"%@",self.pickerViewDataArr[2][row]];
        }
    }else if (component == 3){
        if (self.selectRow2 == 0&&self.selectRow1 == 0&&self.selectRow0 == 0) {
            label.text = [NSString stringWithFormat:@"%@",self.nowPickerViewDataArr[3][row]];
        } else {
            label.text = [NSString stringWithFormat:@"%@",self.pickerViewDataArr[3][row]];
        }
    }else{
        if (self.selectRow3 ==0&&self.selectRow2 == 0&&self.selectRow1 == 0&&self.selectRow0 == 0) {
            label.text = [NSString stringWithFormat:@"%@",self.nowPickerViewDataArr[4][row]];
        } else {
            label.text = [NSString stringWithFormat:@"%@",self.pickerViewDataArr[4][row]];
        }
    }
    return label;
}
pickerView選擇行的代理方法關(guān)鍵代碼
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    //獲取選中的列數(shù)
    self.selectRow0 = [pickerView selectedRowInComponent:0];
    self.selectRow1 = [pickerView selectedRowInComponent:1];
    self.selectRow2 = [pickerView selectedRowInComponent:2];
    self.selectRow3 = [pickerView selectedRowInComponent:3];
    self.selectRow4 = [pickerView selectedRowInComponent:4];
    //先清空之前的數(shù)據(jù),在重新獲取數(shù)據(jù)
    self.pickerViewDataArr = nil;
    self.nowPickerViewDataArr = nil;
    [self getData];
    //刷新后面的列
    if (component == 0) {//選擇完成后加載后面的列的數(shù)據(jù)但是不刷新當(dāng)前列
        [pickerView reloadComponent:1];
        [pickerView reloadComponent:2];
        [pickerView reloadComponent:3];
        [pickerView reloadComponent:4];
    } else if(component == 1){
        [pickerView reloadComponent:2];
        [pickerView reloadComponent:3];
        [pickerView reloadComponent:4];
    }else if(component == 2){
        [pickerView reloadComponent:3];
        [pickerView reloadComponent:4];
    }else if(component == 3){
        [pickerView reloadComponent:4];
    }
}

詳細(xì)代碼看Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,412評(píng)論 6 13
  • 廢話(huà)不多說(shuō),直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,655評(píng)論 0 15
  • 穿過(guò)漫漫的黑夜 終究會(huì)抵達(dá)那個(gè)地方 見(jiàn)到那個(gè)人 有人會(huì)聽(tīng)你的故事 有人會(huì)懂你的喜和傷 你不要急 不管山再怎么高,路...
    虹岑閱讀 230評(píng)論 2 1
  • 2017年10月18日 星期三 晴 晚上孩子放學(xué)回來(lái),去自己房間看書(shū)了,做好飯我去叫他吃飯,吃飽飯兒子主...
    A燕子_fa10閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容