一.UIPickerView
1.UIPickerView的常見屬性
// 數(shù)據(jù)源(用來告訴UIPickerView有多少列多少行)
@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;
// 代理(用來告訴UIPickerView每1列的每1行顯示什么內(nèi)容,監(jiān)聽UIPickerView的選擇)
@property(nonatomic,assign) id<UIPickerViewDelegate> delegate;
// 是否要顯示選中的指示器
@property(nonatomic) BOOL showsSelectionIndicator;
// 一共有多少列
@property(nonatomic,readonly) NSInteger numberOfComponents;
2.UIPickerView的常見方法
// 重新刷新所有列
- (void)reloadAllComponents;
// 重新刷新第component列
- (void)reloadComponent:(NSInteger)component;
// 主動(dòng)選中第component列的第row行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
// 獲得第component列的當(dāng)前選中的行號(hào)
- (NSInteger)selectedRowInComponent:(NSInteger)component;
3.數(shù)據(jù)源方法(UIPickerViewDataSource)
// 一共有多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
// 第component列一共有多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
4.代理方法(UIPickerViewDelegate)
// 第component列的寬度是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
// 第component列的行高是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;
// 第component列第row行顯示什么文字
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
// 第component列第row行顯示怎樣的view(內(nèi)容)
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;
// 選中了pickerView的第component列第row行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
二.UIDatePicker
1.常見屬性
// datePicker的顯示模式
@property (nonatomic) UIDatePickerMode datePickerMode;
// 顯示的區(qū)域語言
@property (nonatomic, retain) NSLocale *locale;
2.監(jiān)聽UIDatePicker的選擇
- 因?yàn)閁IDatePicker繼承自UIControl,所以通過addTarget:...監(jiān)聽
三.Demo
1.UIPickerView的demo(點(diǎn)菜)
效果圖:
需求:選擇器中選擇的什么遵蚜,相應(yīng)的下面的label就顯示什么局装。
代碼:(若想要demo示例副渴,可私下聯(lián)系)
#import "ViewController.h"
@interface ViewController ()<UIPickerViewDataSource, UIPickerViewDelegate>
// pickView
@property (weak, nonatomic) IBOutlet UIPickerView *pickView;
// 所有食物
@property (nonatomic, strong) NSArray *foodArray;
// 水果
@property (weak, nonatomic) IBOutlet UILabel *fruitLabel;
// 主食
@property (weak, nonatomic) IBOutlet UILabel *foodLabel;
// 飲料
@property (weak, nonatomic) IBOutlet UILabel *drinkLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置默認(rèn)選中的內(nèi)容
self.fruitLabel.text = self.foodArray[0][0];
self.foodLabel.text = self.foodArray[1][0];
self.drinkLabel.text = self.foodArray[2][0];
}
#pragma mark - 懶加載
-(NSArray *)foodArray
{
if (_foodArray == nil) {
// 加載plist文件
NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"foods.plist" ofType:nil];
// 初始化(分配內(nèi)存空間)
_foodArray = [NSArray arrayWithContentsOfFile:fullPath];
}
return _foodArray;
}
#pragma mark - UIPickerViewDataSource
// pickview一共多少列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foodArray.count;
}
// 返回pickerView的第component列有多少行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
// 獲取對(duì)應(yīng)列的數(shù)組
NSArray *subFoods = self.foodArray[component];
// 獲取對(duì)應(yīng)列的行數(shù)
return subFoods.count;
}
#pragma mark - UIPickerViewDelegate
// 返回第component列的第row行顯示什么內(nèi)容
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
// 獲取對(duì)應(yīng)列的數(shù)組
NSArray *subFoods = self.foodArray[component];
// 獲取對(duì)應(yīng)行的標(biāo)題
NSString *title = subFoods[row];
return title;
}
// 當(dāng)選中了pickerView的某一行的時(shí)候調(diào)用
// 會(huì)將選中的列號(hào)和行號(hào)作為參數(shù)傳入
// 只有通過手指選中某一行的時(shí)候才會(huì)調(diào)用
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
// 獲取對(duì)應(yīng)列和行的數(shù)據(jù)
NSString *title = self.foodArray[component][row];
// 判斷選擇的是哪一列播赁,根據(jù)列號(hào)設(shè)置對(duì)應(yīng)的數(shù)據(jù)
if (component == 0) {
self.fruitLabel.text = title;
} else if (component == 1) {
self.foodLabel.text = title;
} else {
self.drinkLabel.text = title;
}
}
@end
可能出現(xiàn)的問題:
- 數(shù)據(jù)顯示不出來赁还?
原因:
-
查看一下是否設(shè)置了代理或則數(shù)據(jù)源(或則是否進(jìn)行了連線)
查看一下設(shè)置列數(shù)時(shí)是不是用的是點(diǎn)語法
self.foodArray.count;