前言:UIPickerView是一個選擇器控件,它可以生成單列的選擇器,也可生成多列的選擇器,而且開發者完全可以自定義選擇項的外觀,因此用法非常靈活。UIPickerView直接繼承了UIView,沒有繼承UIControl,因此,它不能像UIControl那樣綁定事件處理方法,UIPickerView的事件處理由其委托對象完成。
正文:UIPickerView控件常用的屬性和方法如下:
numberOfComponents:獲取UIPickerView指定列中包含的列表項的數量。該屬性是一個只讀屬性。
showsSelectionIndicator:該屬性控制是否顯示UIPickerView中的選中標記(以高亮背景作為選中標記)。
numberOfRowsInComponent:獲取UIPickerView包含的列數量。
rowSizeForComponent:獲取UIPickerView包含的指定列中列表項的大小。該方法返回一個CGSize對象。
selectRow:inComponent:animated::該方法設置選中該UIPickerView中指定列的特定列表項。最後一個參數控制是否使用動畫。
selectedRowInComponent::該方法返回該UIPickerView指定列中被選中的列表項。
viewForRow:forComponent::該方法返回該UIPickerView指定列的列表項所使用的UIView控件。
UIDatePicker控件只是負責該控件的通用行為,而該控件包含多少列,各列包含多少個列表項則由UIPickerViewDataSource對象負責。開發者必須為UIPickerView設置UIPickerViewDataSource對象,並實現如下兩個方法。
numberOfComponentsInPickerView::該UIPickerView將通過該方法來判斷應該包含多少列。
pickerView:numberOfRowsInComponent::該UIPickerView將通過該方法判斷指定列應該包含多少個列表項。
如果程序需要控制UIPickerView中各列的寬度,以及各列中列表項的大小和外觀,或程序需要為UIPickerView的選中事件提供響應,都需要為UIPickerView設置UIPickerViewDelegate委托對象,並根據需要實現該委托對象中的如下方法。
pickerView:rowHeightForComponent::該方法返回的CGFloat值將作為該UIPickerView控件中指定列中列表項的高度。
pickerView:widthForComponent::該方法返回的CGFloat值將作為該UIPickerView控件中指定列的寬度。
pickerView:titleForRow:forComponent::該方法返回的NSString值將作為該UIPickerView控件中指定列的列表項的文本標題。
pickerView:viewForRow:forComponent:reusingView::該方法返回的UIView控件將直接作為該UIPickerView控件中指定列的指定列表項。
pickerView:didSelectRow:inComponent::當用戶單擊選中該UIPickerView控件的指定列的指定列表項時將會激發該方法
Interface Builder只支持為UIPickerView設置一個屬性——Shows Selection Indicator,該屬性用於控制是否顯示UIPickerView中的選中標記(以高亮背景作為選中標記)。
實例:通過前面的知識普及,我們知道了UIPickerView的使用方法, 下面通過一個小例子,來更全面的理解。
1.在storyboard裡的controllerView上面拖一個控件,鏈接到.h文件中,代碼如下:
@property (weak, nonatomic) IBOutlet UIPickerView *picker;
2.在.m文件裡設置代理,並設置全局變量,代碼如下:
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>
{
NSArray *_province;
NSDictionary *_city;
NSDictionary *_country;
}
@end
3.設置城市省份數據,代碼如下:
//省
_province = @[@"北京", @"廣西", @"廣東"];
//市
_city = @{
@"北京":@[@"朝陽區", @"東城區", @"西城區"],
@"廣西":@[@"桂林市", @"南寧市"],
@"廣東":@[@"惠州市", @"廣州市", @"深圳市",@"東莞市"]
//縣區
_country = @{
@"朝陽區":@[@"朝陽區1", @"朝陽區2", @"朝陽區3"],
@"東城區":@[@"東城區1", @"東城區2",@"東城區3",@"東城區4"],
@"西城區":@[@"西城區1", @"西城區2", @"西城區3",@"西城區4"],
@"桂林市":@[@"桂林市1", @"桂林市2", @"桂林市3"],
@"南寧市":@[@"南寧市1", @"南寧市2",@"南寧市3",@"南寧市4"],
@"惠州市":@[@"惠州市1", @"惠州市2", @"惠州市3",@"惠州市4"],
@"廣州市":@[@"廣州市1", @"廣州市2", @"廣州市3"],
@"深圳市":@[@"深圳市1", @"深圳市2",@"深圳市3",@"深圳市4"],
@"東莞市":@[@"東莞市1", @"東莞市2", @"東莞市3",@"東莞市4"],
};
4.綁定代理,代碼如下:
self.picker.dataSource = self;
self.picker.delegate = self;
5.設置UIPickerView的數據源方法,代碼如下:
#pragma mark - 該方法的返回值決定該控件包含多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
{
return 3;
}
#pragma mark - 該方法的返回值決定該控件指定列包含多少個列表項
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if (0 == component)
{
return _province.count;
}
if (1 == component) {
NSInteger rowProvince = [pickerView selectedRowInComponent:0];
NSString *provinceName = _province[rowProvince];
NSArray *citys = _city[provinceName];
return citys.count;
}else{
NSInteger rowProvince = [pickerView selectedRowInComponent:0];
NSString *provinceName = _province[rowProvince];
NSArray *citys = _city[provinceName];
NSInteger rowCity = [pickerView selectedRowInComponent:1];
NSString *cityName = citys[rowCity];
NSArray *country = _country[cityName];
return country.count;
}
}
6.設置UIPickerView的代理方法,代碼如下:
#pragma mark - 該方法返回的NSString將作為UIPickerView中指定列和列表項的標題文本
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if (0 == component) {
return _province[row];
}
if(1 == component){
NSInteger rowProvince = [pickerView selectedRowInComponent:0];
NSString *provinceName = _province[rowProvince];
NSArray *citys = _city[provinceName];
return citys[row];
}else{
NSInteger rowProvince = [pickerView selectedRowInComponent:0];
NSString *provinceName = _province[rowProvince];
NSArray *citys = _city[provinceName];
NSInteger rowCity = [pickerView selectedRowInComponent:1];
NSString *cityName = citys[rowCity];
NSArray *country = _country[cityName];
return country[row];
}
}
7.當選中某行時,通過如下的代碼即可獲取到選中的城市地區,
#pragma mark - 當用戶選中UIPickerViewDataSource中指定列和列表項時激發該方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if(0 == component){
[pickerView reloadComponent:1];
[pickerView reloadComponent:2];
}
if(1 == component)
[pickerView reloadComponent:2];
NSInteger rowOne = [pickerView selectedRowInComponent:0];
NSInteger rowTow = [pickerView selectedRowInComponent:1];
NSInteger rowThree = [pickerView selectedRowInComponent:2];
NSString *provinceName = _province[rowOne];
NSArray *citys = _city[provinceName];
NSString *cityName = citys[rowTow];
NSArray *countrys = _country[cityName];
NSLog(@"%@~%@~%@", _province[rowOne], citys[rowTow],countrys[rowThree]);
}
運行結果:好了,通過以上幾個步驟,就可以制作出一個簡單的城市選擇器。運行效如下:
注:藍色按鈕”確定”那一行,是一個UIToolbar控件,在此就不作詳解了,不然會有點喧賓奪主,有興趣的好友,可以私下交流,或者下回分解。