美文网首页
iOS - UIPickerView的使用

iOS - UIPickerView的使用

作者: ShIwEn9 | 来源:发表于2019-06-15 17:00 被阅读0次

在日常的开发中,日期或者城市的等选择器功能的几乎是每个APP必有的。所以了解这些选择器的实现原理就显得格外的重要了。而我们日常实现一个滚动式的选择器大多是继承系统自带的UIPickerView-这个控件。

一、介绍
UIPickerView

通过查看UIPickerView的系统文件可以发现UIPickerView主要是引用了Foundation、CoreGraphics和UIKit框架,同时UIPickerView继承自UIView所以很自然的它拥有UIView的所拥有的特性。


UIPickerView继承图

同时可以发现,UIPickerView有类似于UITableView的数据源和代理方法,其实这也说明了UIPickerView的代码书写和UITableView还是很相像的,UIPickerView也有组和行的概念,但是UIPickerView每一组代表一个竖列。也就是“一个滚轮代表一组”。

通过@property(nonatomic,readonly) NSInteger numberOfComponents;可以获取选择器的分组数。

然后就是实现UIPickerView的代理方法了。

//获取指定分组component中的行数
- (NSInteger)numberOfRowsInComponent:(NSInteger)component;
//获取单元格的Size
- (CGSize)rowSizeForComponent:(NSInteger)component;
//刷新所有的组
- (void)reloadAllComponents;
//刷新指定分组
- (void)reloadComponent:(NSInteger)component;
//选中指定分组中的一行
- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;
//获得指定分组中选中的行
- (NSInteger)selectedRowInComponent:(NSInteger)component;

UIPickerView有两个必须要声明的数据源代理方法

@protocol UIPickerViewDataSource<NSObject>
@required

//一共多少组
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;

// 每一组多少列
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
@end

然后就是UIPickerViewDelegate部分(一些常用的)

@protocol UIPickerViewDelegate<NSObject>

//返回的是一个UIView对象,所以可选就很多了,比如实现“国旗”选择器,放国家的图片、或者字体的颜色等需要重新定义的可以用UILable 等等
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view ;

//返回一个字符串,用的比较多,比如时间和地点信息等
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger) row forComponent:(NSInteger)component ;
//这个和上面的类似,只是返回一个富文本字符串
- (nullable NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED; 

//返回设置的每一组的宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component __TVOS_PROHIBITED;

//返回设置的每一组中每一行的高度
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;

//选中了哪一行,也就是滚轮滚到了那里。
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component __TVOS_PROHIBITED;
二、UIPickerView简单的实现
png
//懒加载数组
-(NSArray *)foods{
    if (!_foods) {
        NSString *str = [[NSBundle mainBundle]pathForResource:@"foods.plist" ofType:nil];
        _foods = [NSArray arrayWithContentsOfFile:str];
    }
    return _foods ;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _pickview = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 70, self.view.bounds.size.width, 200)];
    _pickview.backgroundColor = [UIColor whiteColor];
    [_pickview reloadAllComponents];
    /// 在刷新数据之后操作
    [_pickview selectRow:0 inComponent:0 animated:NO];
    ///  ⚠️这个方法最好加上,要不然可能在不滑动滚轮的情况下,可能没有指
    [self pickerView: _pickview didSelectRow:0 inComponent:0];
    self.pickview.delegate = self ;
    self.pickview.dataSource = self ;
    [self.view addSubview:_pickview] ;
}
#pragma mark  UIPickerViewDataSource
//确定列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return self.foods.count ;
}
//确定行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    NSArray *arr =  self.foods[component] ;
    return arr.count ;
}

#pragma mark  UIPickerViewDelegate
//显示每一列的内容
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    NSArray *arr =self.foods[component];
    return arr[row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    if (component==0) {
        if (row == 0) {
            _str1 = @"" ;
        }else{
        _str1 = self.foods[component][row];
        }
    }
    if (component ==1) {
        if (row == 0) {
            _str2 = @"" ;
        }else{
        _str2 = self.foods[component][row];
        }
    }
    if (component ==2) {
        if (row == 0) {
            _str3 = @"" ;
        }else{
        _str3 = self.foods[component][row];
        }
    }
    _lable.text = [NSString stringWithFormat: @"选择了%@-%@-%@",_str1,_str2,_str3];
}

这样上面的例子就实现了。请大家不要吝啬,提出自己的建议,让我改正,共鸣。

广告:本人实习生,最近想换个工作环境,如果觉得我还可以的话,请向我留言,安徽,杭州,南京地区的都可以。。

相关文章

网友评论

      本文标题:iOS - UIPickerView的使用

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