乍一看,什么是PickerView啊,不看见效果谁都不知道啊,来看一下效果图。
这就是pickView的效果,看着就是一个选择器的样子,来实现以下这个效果。
@interface ViewController (){
NSMutableArray *_leftArr;
NSMutableArray *_middleArr;
NSMutableArray *_rightArr;
NSArray *_arr1;
UILabel *_lab;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIPickerView *view = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 50, 320, 400)];
view.backgroundColor = [UIColor grayColor];
view.dataSource = self;
view.delegate = self;
[self.view addSubview:view];
// 设置数据源
_arr1= @[@"河南",@"河北"];
NSArray *arr2= @[@"南阳",@"周口"];
NSArray *arr3= @[@"石家庄",@"保定"];
NSArray *arr4= @[@"卧龙区",@"宛城区"];
NSArray *arr5= @[@"太康县",@"鹿邑县"];
NSArray *arr6= @[@"石家庄",@"石家庄"];
NSArray *arr7= @[@"保定",@"保定"];
// 把所有地小数组放到大地数组中
_middleArr = [[NSMutableArray alloc] initWithObjects:arr2,arr3, nil];
NSMutableArray *rightArr1 = [[NSMutableArray alloc] initWithObjects:arr4,arr5, nil];
NSMutableArray *rightArr2 = [[NSMutableArray alloc] initWithObjects:arr6,arr7, nil];
// 把所有地小数组放到大地数组中
_rightArr = [[NSMutableArray alloc] initWithObjects:rightArr1,rightArr2, nil];
}
#pragma mark -
#pragma mark pickerViewDatasourse
//返回多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 3;
}
//每列有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
// 返回第0区的行数
if (component == 0) {
return _arr1.count;
}else if (component == 1 ) {
// 首先地知道选择0区地第几行来确定 第1区地行数
// selectedRowInComponent 选择了区中第几行
NSInteger currentRow = [pickerView selectedRowInComponent:0];
// 通过currentRow(当前选中地行)来确定右变返回多少行
// 从大数组中取出小地数组
NSArray *arr = [_middleArr objectAtIndex:currentRow];
return arr.count;
}else{
NSInteger currentRow = [pickerView selectedRowInComponent:0];
NSInteger currentRow1 = [pickerView selectedRowInComponent:1];
NSArray *arr = [_rightArr objectAtIndex:currentRow];
NSArray *arr1 = [arr objectAtIndex:currentRow1];
return arr1.count;
}
}
//设置区中的每一行的标题
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0) {
// 从数组中获取字符串对象
// 通过传递的row 参数来取值
NSString *title = [_arr1 objectAtIndex:row];
return title;
}else if(component == 1){
NSInteger currentRow = [pickerView selectedRowInComponent:0];
NSArray *arr = [_middleArr objectAtIndex:currentRow];
NSString *title = [arr objectAtIndex:row];
return title;
}else{
NSInteger currentRow = [pickerView selectedRowInComponent:0];
NSInteger currentRow1 = [pickerView selectedRowInComponent:1];
NSArray *arr = [_rightArr objectAtIndex:currentRow];
NSArray *arr1 = [arr objectAtIndex:currentRow1];
NSString *title = [arr1 objectAtIndex:row];
return title;
}
}
#pragma mark -
#pragma mark delegate
//已经选择了某个区地某一行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
if(component == 0){
// 刷新所有地区
[pickerView reloadAllComponents];
// 指定刷新某一个区
// [pickerView reloadComponent:1];
// 指定选择某一个区地某一行
[pickerView selectRow:0 inComponent:1 animated:YES];
[pickerView selectRow:0 inComponent:2 animated:YES];
}else if (component == 1){
[pickerView reloadAllComponents];
[pickerView selectRow:0 inComponent:2 animated:YES];
}
}
而这里我为什么要提到DatePicker呢?其实DatePicker跟PickerView是很像的,但是他们可不一样,DatePicker就像是日期时间选择器之类的东西。
我们来看看DatePicker是怎样使用的
@interface ViewController (){
UILabel *_lab;
}
@end
@implementation ViewController
- (void)viewDidLoad{
[super viewDidLoad];
UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 50, 320, 400)];
// 设置样式
datePicker.datePickerMode = UIDatePickerModeDateAndTime;
[datePicker addTarget:self action:@selector(displayTime:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:datePicker];
_lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 420, 320, 40)];
_lab.backgroundColor = [UIColor grayColor];
[self.view addSubview:_lab];
}
- (void)displayTime:(UIDatePicker *)datePicker{
// 获取datepicker当前选中的时间
NSDate *date = datePicker.date;
// 时间转换器
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 设置时间的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd:HH:mm"];
// 把时间转换成字符串
_lab.text = [dateFormatter stringFromDate:date];
}