1. UIPickerView控件
UIPickerView
是一个列表控件,通过代理(UIPickerViewDelegate
)和数据源(UIPickerViewDataSource
)来进行设置。
主要方法
// 刷新所有列
- (void)reloadAllComponents;
// 刷新指定列
- (void)reloadComponent:(NSInteger)component;
// 选择指定列中的指定行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
UIPickerViewDelegate
指定列的高度和宽度,返回每行的标题或者控件
// 指定列的高度和宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
// 返回每行的标题或者控件
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component;
- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row
forComponent:(NSInteger)component;
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(nullable UIView *)view;
// 选择行数
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row
inComponent:(NSInteger)component;
UIPickerViewDataSource
指定显示的列数和每列包含的行数,主要需要覆盖两个方法
// 指定显示的列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
// 指定每列包含的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
指定两列,第一列是省份,第二列是对应的城市名。选择省份后,城市名会对应修改。
示例代码,
- (void)viewDidLoad {
[super viewDidLoad];
self.cityArray = @[@{
@"province" : @"江苏",
@"city" : @[@"南京市", @"无锡市", @"徐州市", @"常州市", @"苏州市", @"南通市",
@"连云港市", @"淮安市", @"盐城市", @"扬州市", @"镇江市", @"泰州市", @"宿迁市"]
}, @{
@"province" : @"浙江",
@"city" : @[@"杭州", @"宁波", @"温州", @"绍兴", @"湖州",
@"嘉兴", @"金华", @"衢州", @"台州", @"丽水", @"舟山"]
}];
CGFloat width = [UIScreen mainScreen].bounds.size.width;
UIPickerView *pickView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, width, 200)];
pickView.delegate = self;
pickView.dataSource = self;
self.selectProvince = 0;
self.selectCity = 0;
[self.view addSubview: pickView];
}
#pragma mark - UIPickerViewDataSource -
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (component == 0) {
return self.cityArray.count;
} else {
NSArray *city = self.cityArray[self.selectProvince][@"city"];
return city.count;
}
}
#pragma mark - UIPickerViewDelegate -
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
if (component == 0) {
return self.cityArray[row][@"province"];
} else {
NSArray *city = self.cityArray[self.selectProvince][@"city"];
return city[row];
}
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
if (component == 0) {
self.selectProvince = row;
// 选中省份后,刷新城市列表,选中第一行
self.selectCity = 0;
[pickerView reloadComponent:1];
[pickerView selectRow:0 inComponent:1 animated:YES];
} else if (component == 1) {
self.selectCity = row;
}
NSLog(@"selectProvince = %@ selectCity = %@", self.cityArray[self.selectProvince][@"province"],
self.cityArray[self.selectProvince][@"city"][self.selectCity]);
}
显示如下
2. UIDatePicker控件
UIDatePicker
用来显示日期。按datePickerMode
属性可以分为四种
typedef NS_ENUM(NSInteger, UIDatePickerMode) {
UIDatePickerModeTime, // 时间模式
UIDatePickerModeDate, // 日期模式
UIDatePickerModeDateAndTime, // 日期和时间模式
UIDatePickerModeCountDownTimer, // 计时模式
}
按preferredDatePickerStyle
属性可以分为三种,
typedef NS_ENUM(NSInteger, UIDatePickerStyle) {
UIDatePickerStyleAutomatic, // 自动选择下面三种模式中一种
UIDatePickerStyleWheels, // 滚轮模式
UIDatePickerStyleCompact, // 袖珍模式
UIDatePickerStyleInline, // 内联模式
}
袖珍模式(UIDatePickerStyleCompact
)只显示,点击后弹出修改界面。
// 当前日期(除计时模式)
@property (nonatomic, strong) NSDate *date;
// 最小日期(除计时模式)
@property (nullable, nonatomic, strong) NSDate *minimumDate;
// 最大日期(除计时模式)
@property (nullable, nonatomic, strong) NSDate *maximumDate;
// 当前时间,除以60后(计时模式)
@property (nonatomic) NSTimeInterval countDownDuration;
// 分钟间隔,默认是1(计时模式)
@property (nonatomic) NSInteger minuteInterval;
计时模式只有滚轮模式。minuteInterval
设置为15,countDownDuration
设置为3600。