IOS:UIPickerView设置三组数据联动的选择框(地区,上课时间段等类型数据的选择)

代码是以前项目遇到问题修改之后整理了一下放到笔记的,当时时间比较匆忙没有添加注释和操作注意事项,仅供参考吧,当时项目做的是一个选课的时间和地区选择两种类型,都是用下面类似的方法来实现的。地区选择就不说了,简单说一下时间选择的,项目是一款预约课程的app,时间选择主要是为了老师对创建的课程进行时间段设置的,三拦的选择分别是日期(月日),起始时间(9:00-19:00的整点时间),结束时间(10:00-20:00的整点时间)。最短上课时间1小时,其中上课日期是当天的从当前时间往后算的整数时间开始。当时遇到的问题是从今天切换到明天的时候,二三栏的数据要回到起点,也就是9:00和10:00,,回到今天又改成当前时间往后推算的数据,实现联动。因为当时的模块写的时候总是数组越界,因此做了改良,代码在下面,仅供参考吧,项目过去太久不好整理了,也算留个笔记方便查看了。


1、数据准备阶段要先准备第一个commpent的数组数据,然后用第一组内的字符串内容作为key ,其下联动的第二组数据作为object存到私有的字典内,然后再每次调用协议方法的时候在字典中取出不同的第二组和第三组数据,然后reload

相关协议方法:

-(void)setDatasArr:(NSMutableArray *)datasArr{
    _datasArr = datasArr;
    //设置不是当天的数组数据
    NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"9:00",@"10:00",@"11:00",@"12:00",@"13:00",@"14:00",@"15:00",@"16:00",@"17:00",@"18:00",@"19:00", nil];
    NSMutableArray *arr2 = [dic objectForKey:@"9:00"];
    
    //获取当前时间的小时
    NSDate *nowDate = [NSDate date];
    NSCalendar *cal = [NSCalendar currentCalendar];
    unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit;
    NSDateComponents *dd = [cal components:unitFlags fromDate:nowDate];
    int hour = (int)[dd hour];
    int startHour = hour+1;
    
    NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"9:00",@"10:00",@"11:00",@"12:00",@"13:00",@"14:00",@"15:00",@"16:00",@"17:00",@"18:00",@"19:00", nil];
    NSMutableArray *arr = [NSMutableArray arrayWithArray:arr3];
    for (int i = 0; i<arr.count; i++) {
        NSString *time = (NSString *)[arr objectAtIndex:i];
        int temp = [[[time componentsSeparatedByString:@":"]firstObject] intValue];
        if (temp<startHour) {
            [arr3 removeObject:time];
        }
    }
    NSString *startTime = [NSString stringWithFormat:@"%d:00",startHour];
    NSMutableArray *arr4 = [dic objectForKey:startTime];
    for (int i = 0; i<datasArr.count; i++) {
        NSString *timeStr = [datasArr objectAtIndex:i];
        if (i == 0) {
            [secondDic setObject:arr3 forKey:timeStr];
        }else{
            [secondDic setObject:arr1 forKey:timeStr];
        }
    }
    
    secondArr = arr3;
    thirdArr = arr4;
    _str_select = [NSString stringWithFormat:@"%@  %@-%@",_datasArr[0],secondArr[0],thirdArr[0]];
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 3;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(component == 0){
        return [_datasArr count];
    }else if(component == 1){
        return [secondArr count];
    }else{
        return [thirdArr count];
    }
}

-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component==0) {
        return [_datasArr objectAtIndex:row];
    }else if (component==1){
        return [secondArr objectAtIndex:row];
    }else{
        return [thirdArr objectAtIndex:row];
    }
}

-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
    return 33.5f;
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    if (component==0) {
        secondArr = [secondDic objectForKey:[_datasArr objectAtIndex:row]];
        thirdArr = [dic objectForKey:[secondArr objectAtIndex:0]];
        [pickerView selectRow:0 inComponent:1 animated:YES];
        [pickerView selectRow:0 inComponent:2 animated:YES];
        [pickerView reloadComponent:1];
        [pickerView reloadComponent:2];
    }else if (component ==1){
        thirdArr = [dic objectForKey:[secondArr objectAtIndex:row]];
        [pickerView selectRow:0 inComponent:2 animated:YES];
        [pickerView reloadComponent:2];
    }
    
    _str_select = [NSString stringWithFormat:@"%@  %@-%@",_datasArr[[pickerView selectedRowInComponent:0]],secondArr[[pickerView selectedRowInComponent:1]],thirdArr[[pickerView selectedRowInComponent:2]]];
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
    
    if (component == 0) {
        UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, kScreen_width/3, 30.0f)];
        NSString *imgstr1 = [[NSString alloc] initWithFormat:@"%@",[_datasArr objectAtIndex:row]];
        label.text = imgstr1;
        label.font = SystemFont14;
        [label sizeToFit];
        label.backgroundColor = [UIColor clearColor];
        label.center = view.center;
        return label;
    }
    if (component == 1) {
        UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, kScreen_width/3, 30.0f)];
        NSString *imgstr1 = [[NSString alloc] initWithFormat:@"%@",[secondArr objectAtIndex:row]];
        label.text = imgstr1;
        label.font = SystemFont14;
        [label sizeToFit];
        label.backgroundColor = [UIColor clearColor];
        label.center = view.center;
        return label;
        
    }
    
    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, kScreen_width/3, 30.0f)];
    NSString *imgstr1 = [[NSString alloc] initWithFormat:@"%@",[thirdArr objectAtIndex:row]];
    label.text = imgstr1;
    label.font = SystemFont14;
    [label sizeToFit];
    label.backgroundColor = [UIColor clearColor];
    label.center = view.center;
    return label;
    
}
 
 


猜你喜欢

转载自blog.csdn.net/qishiai819/article/details/50427691