UIPickerView
UIPickerView是一個拾取器,UIPickerView和UIDatePicker是類似的控件,隻不過UIDatePicker是日期控件,隻能放日期,而UIPickerView可以放任何東西。它比UIDatePicker更加通用,它可以生成單列的選擇器,也可生成多列的選擇器,而且開發者完全可以自定義選擇項的外觀,是以用法非常靈活。UIPickerView直接繼承了UIView,沒有繼承UIControl,是以,它不能像UIControl那樣綁定事件處理方法,UIPickerView的事件處理由其委托對象完成。使用UIPickerView的對象應該遵守UIPickerViewDataSource,UIPickerViewDelegate。
常用屬性和方法:
1、numberOfComponents:擷取UIPickerView指定列中包含的清單項的數量。該屬性是一個隻讀屬性。
2、showsSelectionIndicator:該屬性控制是否顯示UIPickerView中的選中标記(以高亮背景作為選中标記)。
3、-numberOfRowsInComponent::擷取UIPickerView包含的列數量。
4、- rowSizeForComponent::擷取UIPickerView包含的指定列中清單項的大小。該方法傳回一個CGSize對象。
5、- selectRow:inComponent:animated::該方法設定選中該UIPickerView中指定列的特定清單項。最後一個參數控制是否使用動畫。
6、- selectedRowInComponent::該方法傳回該UIPickerView指定列中被選中的清單項。
7、- 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控件的指定列的指定清單項時将會激發該方法。
PickerVIew的簡單使用(先以單列選擇器為例)
#import "ViewController.h"
#define SCREEN_BOUNDS [UIScreen mainScreen].bounds//螢幕尺寸
#define SCREEN_WIDTH CGRectGetWidth([UIScreenmainScreen].bounds)//螢幕寬
#define SCREEN_HEIGHT CGRectGetHeight([UIScreenmainScreen].bounds)//螢幕高
@interface ViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>//挂代理
{ UIPickerView *pickerView;//建立pickerVIew
NSArray *dataArray;//建立資料源數組
} @end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
dataArray = @[@"1",@"2",@"3",@"4",@"5",@"6"];
pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, SCREEN_HEIGHT/2, SCREEN_WIDTH, SCREEN_HEIGHT/2)];
[self.view addSubview:pickerView];
pickerView.delegate = self;
pickerView.dataSource = self;
}
#pragma mark 代理
//UIPickerViewDataSource中定義的方法,該方法的傳回值決定該控件包含的列數
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView{
return 1;
// 傳回1表明該控件隻包含1列
}
//UIPickerViewDataSource中定義的方法,該方法的傳回值決定該控件指定列包含多少個清單項
- (NSInteger)pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component{
// 由于該控件隻包含一列,是以無須理會列序号參數component
// 該方法傳回teams.count,表明teams包含多少個元素,該控件就包含多少行
return dataArray.count;
}
- (NSString *)pickerView:(UIPickerView*)pickerView titleForRow:(NSInteger)rowforComponent:(NSInteger)component{
// 由于該控件隻包含一列,是以無須理會列序号參數component
// 該方法根據row參數傳回teams中的元素,row參數代表清單項的編号,
// 是以該方法表示第幾個清單項,就使用teams中的第幾個元素
return [dataArrayobjectAtIndex:row];
}
// 當使用者選中UIPickerViewDataSource中指定列和清單項時激發該方法
- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)rowinComponent:(NSInteger)component{
// 使用一個UIAlertView來顯示使用者選中的清單項
NSString *alertString = [NSString stringWithFormat:@"選中了第%ld列,第%ld行",component,row];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"選中資訊" message:alertString preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的"style:UIAlertActionStyleDestructive handler: ^(UIAlertAction * _Nonnullaction){
}];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
}
@end