美文网首页
01-UIPickerView

01-UIPickerView

作者: 小胖子2号 | 来源:发表于2017-09-22 15:52 被阅读27次

一.UIPickerView

1.UIPickerView的常见属性

// 数据源(用来告诉UIPickerView有多少列多少行)
@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;

// 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听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;

// 主动选中第component列的第row行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;

// 获得第component列的当前选中的行号
- (NSInteger)selectedRowInComponent:(NSInteger)component;

3.数据源方法(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(内容)
- (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;

// 显示的区域语言
@property (nonatomic, retain) NSLocale   *locale;

2.监听UIDatePicker的选择

  • 因为UIDatePicker继承自UIControl,所以通过addTarget:...监听

三.Demo

1.UIPickerView的demo(点菜)

效果图:

1.png

需求:选择器中选择的什么,相应的下面的label就显示什么。

代码:(若想要demo示例,可私下联系)

#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];
    // 设置默认选中的内容
    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];
        // 初始化(分配内存空间)
        _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
{
    // 获取对应列的数组
    NSArray *subFoods = self.foodArray[component];
    // 获取对应列的行数
    return subFoods.count;
}

#pragma mark - UIPickerViewDelegate
// 返回第component列的第row行显示什么内容
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    // 获取对应列的数组
    NSArray *subFoods = self.foodArray[component];
    // 获取对应行的标题
    NSString *title = subFoods[row];
    return title;
}
    
// 当选中了pickerView的某一行的时候调用
// 会将选中的列号和行号作为参数传入
// 只有通过手指选中某一行的时候才会调用
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // 获取对应列和行的数据
    NSString *title = self.foodArray[component][row];
    // 判断选择的是哪一列,根据列号设置对应的数据
    if (component == 0) {
        self.fruitLabel.text = title;
    } else if (component == 1) {
        self.foodLabel.text = title;
    } else {
        self.drinkLabel.text = title;
    }
}

@end

可能出现的问题:

  1. 数据显示不出来?
    原因:
  • 查看一下是否设置了代理或则数据源(或则是否进行了连线)


    2.png
  • 查看一下设置列数时是不是用的是点语法self.foodArray.count;

相关文章

  • 01-UIPickerView

    一.UIPickerView 1.UIPickerView的常见属性 2.UIPickerView的常见方法 3....

网友评论

      本文标题:01-UIPickerView

      本文链接:https://www.haomeiwen.com/subject/qrvujxtx.html