• IOS 取值控件(UIPicker)的使用方法


    1.简单地取值控件示例

    我们要做的一个UITextFiled,当点击UITextFiled,出现一个UIPick取值的页面,可以选择性别,在viewDidLoad中写下

    //sexPicker
        UIPickerView *sexPicker=[[UIPickerView alloc]init];
        sexPicker.showsSelectionIndicator=YES;
        sexPicker.delegate=self;
        sexPicker.dataSource=self;
        self.sex.inputView=sexPicker;

    对于数据源回调函数和代理回调函数的实现,代码如下:

     1 #pragma sexPicker
     2 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
     3 {
     4     return rSexComponentCount;
     5 }
     6 
     7 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
     8 {
     9     return rSexRowCount;
    10 }
    11 
    12 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    13 {
    14     if(0==row)
    15     {
    16         return @"Male";
    17     }
    18     else
    19     {
    20         return @"Female";
    21     }
    22 }
    23 
    24 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    25 {
    26     if (0==row) {
    27         self.sex.text=@"Male";
    28     }
    29     else
    30     {
    31         self.sex.text=@"FeMale";
    32     }
    33 }

    显示结果如图:

    2.UIPickData的使用

    在viewDidLoad中添加如下代码:

    //birthday Picker Choose
        self.birthdate.clearButtonMode=UITextFieldViewModeNever;
        UIDatePicker *birthPicker=[[UIDatePicker alloc]init];
        birthPicker.datePickerMode=UIDatePickerModeDate;
        //birthPicker.locale=[[NSLocale alloc]initWithLocaleIdentifier:<#(NSString *)#>];
        NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
        formatter.dateFormat=@"MM-dd-yyyy";
        NSString *stdDate=@"01-01-1990";
        birthPicker.date=[formatter dateFromString:stdDate];
        [birthPicker addTarget:self action:@selector(chooseDate:) forControlEvents:UIControlEventValueChanged];
        self.birthdate.inputView=birthPicker;

    其的触发事件函数

    #pragma DatePicker
    -(void)chooseDate:(UIDatePicker *)datePicker
    {
        NSDate *date=datePicker.date;
        NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
        formatter.dateFormat=@"MM-dd-yyyy";
        NSString *dateString=[formatter stringFromDate:date];
        self.birthdate.text=dateString;
        
        //[showAllBarButton appendString:[[NSString alloc] initWithString:dateString]];
        //self.barButtonItem.title=showAllBarButton;
        
    }

    运行结果:

    3.自定义UIPicker的选项外观

     除了通过简单的字符串进行UIPicker的显示之外,系统也提供了自定义视图的方法来为每一个选项进行自定义,API如下:

    -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

    虽然在每次调用此方法时都重新生成一个全新的UIView子类对象,配置完后返回给调用者也能够达到自定义选项的效果。不过就像UITableView的重用机制般,这里也必须考虑到当选项数量特别巨大时,有理由使用此代理方法提供的reusingView参数来重用之前的视图。

    所以为了方便维护和扩展起见,专门新建一个自定义的UIView子类比较好,取名为customRowView,考虑到需要让此类有一定的外部配置功能,所以customRowView的头文件可以设置如下:

     1 #import <UIKit/UIKit.h>
     2 
     3 #define CUSTOM_HEIGHT 60.0f
     4 #define CUSTOM_WIDTH 240.0f
     5 
     6 @interface HBCustomRowView : UIView
     7 {
     8     @private
     9     UIImageView *_photoView;
    10     UILabel *_nameLabel;
    11 }
    12 
    13 @property(nonatomic,retain) UIImage *photo;
    14 @property(nonatomic,retain) NSString *name;
    15 
    16 @end

    上述代码中,两个属性photo和name是专供外部进行重用配置的,而长度的宏定义是为新建对象和实现特定UIPicker代理方法服务。

    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
        //照片
        if (!_photoView) {
            _photoView = [[UIImageView alloc]initWithFrame:CGRectMake(10.0f, 0.0f, CGRectGetWidth(self.frame)-50.0f, CGRectGetHeight(self.frame))];
            
            _photoView.backgroundColor = [UIColor clearColor];
            [self addSubview:_photoView];
        }
        
        _photoView.image=self.photo;
        
        //球员名字
        if (!_nameLabel) {
            _nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_photoView.frame), 0.0f, CGRectGetWidth(self.frame)-CGRectGetMaxX(_photoView.frame)-5.0f, CGRectGetHeight(self.frame))];
            _nameLabel.backgroundColor = [UIColor clearColor];
            _nameLabel.textAlignment = NSTextAlignmentRight;
            _nameLabel.textColor = [UIColor darkGrayColor];
            _nameLabel.shadowColor = [UIColor blackColor];
            _nameLabel.shadowOffset = CGSizeMake(1.0f, 1.0f);
            _nameLabel.numberOfLines=0;
            _nameLabel.font = [UIFont systemFontOfSize:14.0f];
            
            [self addSubview:_nameLabel];
        }
        _nameLabel.text=self.name;
    }

    然后需要UIPickerView准备一个数据源对象和代理对象,此对象的相关代码实现如下:

    #pragma mark-
    #pragma mark UIPicker datasource
    //几列
    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    {
        //只显示球员
        return 1;
    }
    
    //每列多少行选项
    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    {
        return _datasource.count;
    }
    
    #pragma mark-
    #pragma mark UIPicker delegate
    //每列的宽度
    -(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
    {
        return 240.0f;
    }
    
    //每列的高
    -(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
    {
        return 60.0f;
    }
    
    //那列第几行的内容的标题
    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    {
        return @"";
    }
    
    //选中任何列的某一行
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
    }
    
    //自定义UIPickerView的选项视图
    -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
    {
        HBCustomRowView *aCustomView = nil;
        HBPlayerInfo *onePlayer =nil;
        
        //异常
        if(row>=_datasource.count)
        {
            return [[UIView alloc]init];
        }
        //取出相应的球员对象
        NSDictionary *player=[_datasource objectAtIndex:row];
        onePlayer.name=[player objectForKey:@"name"];
        onePlayer.role=[player objectForKey:@"role"];
        onePlayer.number=[player objectForKey:@"number"];
        if(view)
        {
            //重用
            aCustomView=(HBCustomRowView *)view;
            
            //让重用的视图再次调用drawRect方法
            [aCustomView setNeedsDisplay];
        }
        else
        {
            //新建
            aCustomView =[[HBCustomRowView alloc]initWithFrame:CGRectMake(0.0f, 0.0f, 240.0f, 60.0f)];
            aCustomView.backgroundColor=[UIColor clearColor];
        }
        
        //配置自定义视图
        aCustomView.photo = [UIImage imageNamed:@"gaolin.jpeg"];
        aCustomView.name=onePlayer.name;
        
        return  aCustomView;
    }
  • 相关阅读:
    面向对象的相关知识
    模块的导入
    正怎表达式在爬虫里的应用
    前端~css
    CSS知识点
    初识Html
    Python之路--协程/IO多路复用
    进程
    锁 和 线程池
    操作系统-并发-线程-进程
  • 原文地址:https://www.cnblogs.com/haibosoft/p/3673007.html
Copyright © 2020-2023  润新知