UITextField自定义键盘

UITextField有一个inputView的属性,可以通过给inputView赋值的方法给UITextField定制键盘。如下图所示,我们可以通过给UITextField自定义键盘,使它的输入控件为时间选择器:

123.png

实现过程如下:
首先,自定义一个继承自UITextField的类:

@interface BirthdayField : UITextField

@end

然后,我们初始化它的时候,给它指定一个inputView:


-(void)initTextValue
{
    [self valueChange:self.datePicker];
}

-(instancetype)initWithFrame:(CGRect)frame
{
    if(self == [super initWithFrame:frame])
    {
        [self initView];
    }
    
    return self;
}
-(void)awakeFromNib
{
    [super awakeFromNib];
    [self initView];
}

-(void)initView
{
    UIDatePicker *date = [[UIDatePicker alloc]init];
    //日期格式
    date.datePickerMode = UIDatePickerModeDate;
    //中国
    date.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
    [date addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];
    self.datePicker = date;
    self.inputView = date;
}

-(void)valueChange:(UIDatePicker *)sender
{
    NSLog(@"%@",sender.date);
    NSDateFormatter *format = [[NSDateFormatter alloc]init];
    format.dateFormat = @"yyyy-MM-dd";
    self.text = [format stringFromDate:sender.date];
}

其次,调用的时候,我们可能不想让自定义的TextField中有用户通过其他键盘输入的内容,需要在它的代理方法中返回NO:

//是否允许用户自己输入
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSLog(@"%s",__func__);
    return NO;
}

最后,我们可能需要在TextField刚获得焦点的时候给它一个默认值。这个时候,我们就需要写一个设置默认值的方法,并在代理方法-(void)textFieldDidBeginEditing: 中调用:

@interface BirthdayField : UITextField

-(void)initTextValue;

@end
-(void)initTextValue
{
    [self valueChange:self.datePicker];
}
-(void)textFieldDidBeginEditing:(id )textField
{
    if([textField respondsToSelector:@selector(initTextValue)])
    {
        [textField initTextValue];
    }  
}

附上demo地址:demo

推荐阅读更多精彩内容