UIPickerView
UIPickerView是 iOS 開發中常用的用戶界面組件之一,用于在垂直方向上顯示一個滾動的列表,用戶可以通過滾動選擇其中的一項。
UIPickerView的協議方法
UIPickerView和UItableView差不多,UIPickerView也要設置代理和數據源。UIPickerView的數據源和代理方法中:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;// 設置UIPickerView的列數
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;// 設置UIPickerView的行數
上面這兩個方法是必須要實現的,其中前者負責設置UIPickerView的列數,后者負責設置行數。
其他協議方法:
// 設置PickerView第row行的選項標題
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
// 設置第component列第row行顯示的視圖
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
// 當選中第component列第row行的時候,就調用該方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
// 設置第component列的寬度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
// 設置第component列的行高
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;// 獲取第component列第row行的視圖,前提是該列必須是通過視圖顯示
- (UIView *)viewForRow:(NSInteger)row forComponent:(NSInteger)component;
// 刷新所有列的數據
- (void)reloadAllComponents;
// 刷新第component列的數據
- (void)reloadComponent:(NSInteger)component;
// 在PickerView里顯示選中第component列第row的數據
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
// 獲取第component列選中的行號
- (NSInteger)selectedRowInComponent:(NSInteger)component;
注意
- PickerView的高度iOS9之前不能改,默認216,即使修改了也還是216;在iOS9上設置高度為0,PickerView會不顯示
- PickerView里面每行的高度可以改
- 系統自帶的控件,數據源和代理屬性不需要IBOutlet,也能拖線。自己定義的屬性,想要拖線,必須寫IBOutlet。
一個demo:
ViewController.h:
#import <UIKit/UIKit.h>@interface ViewController : UIViewController<UIPickerViewDelegate, UIPickerViewDataSource>@property (nonatomic, strong) UIPickerView *pickerView;
@property (nonatomic, copy) NSArray *myArray;
@property (nonatomic, copy) NSArray *chushiArr;
@property (nonatomic, copy) NSArray *juLiArr;
@property (nonatomic, copy) NSArray *caiPinArr;@end
ViewController.m
#import "ViewController.h"@interface ViewController () <UIPickerViewDelegate, UIPickerViewDataSource>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.pickerView = [[UIPickerView alloc] init];self.pickerView.delegate = self;self.pickerView.dataSource = self;self.pickerView.frame = CGRectMake(0, 200, self.view.bounds.size.width, 500);self.chushiArr = @[@"銷量最高", @"評分最高", @"價格最低", @"價格最高"];self.juLiArr = @[@"距離最近", @"距離最遠"];self.caiPinArr = @[@"種類最多", @"銷量最高", @"價格最低", @"價格最高"];self.myArray = self.chushiArr;[self.view addSubview:self.pickerView];
}- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {return 2;
}- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {if (component == 0) {return 3;}return [self.myArray count];
}- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {NSArray *xuanZe = @[@"廚師", @"距離", @"菜品"];if (component == 0) {return xuanZe[row];}return self.myArray[row];
}- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {if (component == 0) {if (row == 0) {self.myArray = self.chushiArr;} else if (row == 1) {self.myArray = self.juLiArr;} else if (row == 2) {self.myArray = self.caiPinArr;}[self.pickerView reloadComponent:1];}
}@end
運行結果: